Hi,
I've been trying to cleanup uClibc test-suite failures on ARC and when debugging
test-double ran into a totally unrelated issue where it fails as
| testing double (without inline functions)
| Failure: finite (0): errno set to 11, expected 0 (unchanged)
Turns out the test harness uses asprintf() which seems to be fudging errno causing
test harness to erroneously declare failure:
Here's a simple test case which shows the problem:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
void main(void)
{
const char *this_func = "finite";
char *test_name;
errno = 0;
if (asprintf (&test_name, "%s (%s)", this_func, "my-str")
== -1)
abort ();
printf("%d\n", errno); // <-- prints 11
}
The errno unconditionally being set to EAGAIN seems to have been introduced in
commit 568ceebf6adfc58c64a95133311268db6 ("Fix infinite loop when fopencookie
custom write returns 0 on error") bakc in 2016.
+#define __STDIO_STREAM_CUSTOM_WRITE_FUNC(S, ARGS...) \
+ if (__STDIO_STREAM_IS_CUSTOM((S))) { \
+ _IO_cookie_file_t *cfile = (_IO_cookie_file_t *) (S); \
+ if (cfile->__gcs.write == NULL) { \
+ __set_errno(EINVAL); \
+ return -1; \
+ } \
+ __set_errno(EAGAIN); \
+ ssize_t w = cfile->__gcs.write(cfile->__cookie, ##ARGS); \
+ return (w == 0 ? -1 : w); \
+ }
I don't understand all the logic but shouldn't it be set after __gcs.write() call
?
Thx,
-Vineet