Undocumented issue: Open system call blocks on named pipes (and a feature request)

Cameron Simpson cs at cskk.id.au
Fri Dec 28 18:37:14 EST 2018


On 28Dec2018 20:21, Daniel Ojalvo <D.Ojalvo at F5.com> wrote:
>I agree that previous behavior shouldn't be changed, but I would 
>suggest updating the documentation to point it out as a footnote. The 
>current behavior is correct just unclear. Most people just learning 
>about the open command wouldn't have this expectation.

Maybe, maybe not. "Most" is a conjecture. IMO people will only find it 
surprising if they think any filesystem object can be instantly opened.  
However that is a misapprehension on their part.

My personal expectation is that open() will come back when the object is 
open. I don't have a timeframe in mind unless I have a strong 
expectation about _what_ I'm opening.

>I came across the issue when I had a program that would open up all the 
>files in a directory to read a few bytes from the beginning. My concern 
>would be someone just making a named pipe over a file that a program 
>would open.

What about a symlink to a magic /dev/tcp/host:port device, initiating a 
TCP connection? Particularly if "host" is down or inaccessible? Etc.

>Arguably, anyone affected by that would be shooting themselves in the 
>foot to begin with, but I think there are "security" concerns because 
>someone could cause a bit of mischief that would be difficult to 
>diagnose.

It isn't hard to diagnose at all. Point strace at the hung pogram, see 
it is opening some path, "ls -ld the-path", oooh, it isn't a regular 
file.

The point here is that if a programme opens every file in a directory, 
maybe it should constrain itself to regular files. Opening anything else 
may not just hang, it can have real world side effects. (Usually such 
effect happen at some point after open, for example opening a rewind 
take device will physicially rewind the tape on close, but you've 
committed to that happening by opening it in the first place.)

I think Chris offered the example of a subdirectory to suggest that such 
a programme already has an opnion about what to open and what to leave 
alone (unless is _does_ open() subdirectories, which might be useful but 
is usually misleading and on some OSes unsupported). So the programme 
should be pickier anyway.

>That all being said, I think I would like to put in a feature request 
>for a non-blocking option. How should I go about doing so?

I agree with the suggestion already made: devise a well thought out 
proposal which fits nicely with the existing open() call (eg an addition 
to the mode argument or something), and describe it clearly in 
python-ideas.

Certainly a number of things can be opened in a "nonblocking" mode, 
which means that reads return instantly if there's no available data, so 
having an open not block isn't unreasonable to want. But it may be 
unreasonable to implement in general: OSes may not support it directly.

Cheers,
Cameron Simpson <cs at cskk.id.au>


More information about the Python-list mailing list