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


_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to