[PATCH] prevent retries on fclose/fflush after write errors

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Fri Feb 11 18:18:52 UTC 2011


"Denys Vlasenko" <vda.linux at googlemail.com> 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.


More information about the uClibc mailing list