Strange echo behaviour

Denys Vlasenko vda.linux at googlemail.com
Thu Jan 27 09:11:22 UTC 2011


On Thu, Jan 27, 2011 at 6:48 AM, Rich Felker <dalias at aerifal.cx> wrote:
>> > Looking into the code it seems like the fflush() call at the end for
>> > echo_main() is somehow responsible for this, but this is only a guess.
>>
>> I would like to make it so that echo doesn't retry failed writes
>> (except on EINTR).
>>
>> I wonder how to fix this, though. I can easily detect write error,
>> but how to discard buffered data in a FILE object?
>> Even without fflush(), libc will try to write it out at fclose()!
>
> Are you sure? My impression was that after error, the FILE enters an
> error state, the buffer is invalidated, and no further IO will be
> attempted unless clearerr is called. I suspect libcs could differ in
> this regard...
>
> One way to prevent further writes reliably is:
>
> tmp=open("/dev/null", O_RDONLY);
> dup2(tmp, fileno(f));
> close(tmp);

This clobbers the descriptor. echo_main() is called by shell code
directly. So, this shell fragment:

echo qwerty   # assume we get write error here
echo asdfgh
err=$?
exec 2>&1

will exhibit two bugs: $err will be 0 and fd 2 will be dup'ed
to a wrong fd.

-- 
vda


More information about the busybox mailing list