On Friday 11 February 2011 19:18, Bernhard Reutner-Fischer wrote: > "Denys Vlasenko" <[email protected]> wrote: > > >Currently, uclibc retains buffered data on stdio write errors, > >and subsequent fclose and fflush will try to write it out again > >(in most cases, in vain). > > > >Which results in something like this: > > > >On Wednesday 26 January 2011 13:21, Baruch Siach wrote: > >> Hi busybox list, > >> > >> I'm running the following command under strace (thanks Rob): > >> > >> echo 56 > /sys/class/gpio/export > >> > >> and I see the following output: > >> > >> write(1, "56\n", 3) = -1 EBUSY (Device or > >resource busy) > >> write(1, "5", 1) = 1 > >> > >> The first EBUSY is OK, since GPIO 56 is already requested. But the > >second > >> write() attempt seems strange, and leads to an unwanted outcome. GPIO > >5 gets > >> exported. > > > > > >This patch prevents that. > > > >-- > >vda > > > >diff -d -urpN uClibc.0/libc/stdio/_wcommit.c > >uClibc.1/libc/stdio/_wcommit.c > >--- uClibc.0/libc/stdio/_wcommit.c 2011-02-07 00:04:34.000000000 +0100 > >+++ uClibc.1/libc/stdio/_wcommit.c 2011-02-07 00:55:24.000000000 +0100 > >@@ -20,7 +20,18 @@ size_t attribute_hidden __stdio_wcommit( > > > > __STDIO_STREAM_VALIDATE(stream); > > > >- if ((bufsize = __STDIO_STREAM_BUFFER_WUSED(stream)) != 0) { > >+ /* Note: we do not write anything if write error has been detected. > >+ * Otherwise, stdio user has no way to prevent retries after > >+ * failed write - and some users do want to not have any retries! > >+ * IOW: if write errored out, neither fflush nor fclose should > >+ * try to write buffered data. > >+ * clearerr may be used to enable retry if needed. > >+ */ > >+ > >+ bufsize = __STDIO_STREAM_BUFFER_WUSED(stream); > >+ if (bufsize != 0 > >+ && !(stream->__modeflags & __FLAG_ERROR) > >+ ) { > > stream->__bufpos = stream->__bufstart; > > __stdio_WRITE(stream, stream->__bufstart, bufsize); > > } > > Hi, > > Sounds plausible (but I did not check the standard), please install.
It turned out that fixing just fflush/fclose isn't enough: it doesn't fix the problem when we *continue* to write to this FILE* (as it happens in busybox shells). I ended up dropping FILE-based output in echo, and used fd-based io. IOW: for the particular bug I was working on, this fix is no longer needed. Do you think it still needs to be applied? -- vda _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
