kern/170203: [kern] piped dd's don't behave sanely when dealing with a fifo

David Xu listlog2011 at gmail.com
Fri Jul 27 12:29:09 UTC 2012


On 2012/7/27 19:08, Bruce Evans wrote:
> On Fri, 27 Jul 2012, David Xu wrote:
>
>> On 2012/7/27 10:07, Bruce Evans wrote:
>>>
>>> I think it's working almost as expected.  Large blocks give non-atomic
>>> I/O, so the reader sees small blocks, then EOF when it gets ahead of
>>> the writer.  This always happens without SMP.
>>>
>>> Not is a bug (debugged below).  There is no SIGPIPE at the start of
>>> write() because there is a reader then, and no SIGPIPE for the next
>>> write() because there is no next write() -- the current one doesn't
>>> notice when the reader goes away.
>>>
>> After fixed dd to not open fifo output file in O_RDWR mode, I still 
>> found the
>> writer is blocked there even the reader is already exited.
>
> I'm not sure that dd's open is a bug.  It must be intentional to use
> O_RDWR for some cases.
>
Don't know if original author even thought about FIFO.

> POSIX (old 2001 draft) doesn't say anything about dd's open mode.
>
>> I think this is definitely a bug. if reader is exited, the writer 
>> should be aborted too,
>> but I found it still be blocked in state "pipedwt", obviously, the 
>> code in
>> /sys/fs/fifo_vnops.c wants to wake up the writer when the reader is 
>> closing the fifo,
>> but it failed, because the bit flag PIPE_WANTW is forgotten to be set 
>> by writer,
>> so it skips executing wakeup(), and then the writer has no chance to 
>> find EOF bit flag
>> is set.
>
> Does this affect nameless pipes too?  The old implementation presumably
> doesn't have this bug.
>
It is easy to repeat the bug for named pipes,  don't know if nameless 
pipes have
same bug,  I can not reproduce it yet.


> Bruce
> .
>



More information about the freebsd-bugs mailing list