diff options
author | John Högberg <[email protected]> | 2018-02-26 10:28:26 +0100 |
---|---|---|
committer | John Högberg <[email protected]> | 2018-02-26 12:16:59 +0100 |
commit | 6f120d4ab4fab2231f7475256bcc1eeac2bfe6e5 (patch) | |
tree | dc9122196136d411d89b620bd56f901878e224fb /erts | |
parent | 7914843737e490c49b0918b67a093e68415b3beb (diff) | |
download | otp-6f120d4ab4fab2231f7475256bcc1eeac2bfe6e5.tar.gz otp-6f120d4ab4fab2231f7475256bcc1eeac2bfe6e5.tar.bz2 otp-6f120d4ab4fab2231f7475256bcc1eeac2bfe6e5.zip |
Allow opening device files and FIFOs with file:open/2
To the best of our knowledge this was introduced since file operations
on device files/FIFO:s could hang the emulator forever back when the
emulator was single-threaded and lacked IO threads; a read operation
could block all progress preventing the write operation it waited for
from occurring.
Granted, this could still happen through starving all dirty IO
schedulers, but the same issue can arise with NFS files which we've
always allowed.
Removing this restriction also lets us remove a stat(2) call that was
added to specifically allow `/dev/null`.
Diffstat (limited to 'erts')
-rw-r--r-- | erts/emulator/nifs/unix/unix_prim_file.c | 19 |
1 files changed, 3 insertions, 16 deletions
diff --git a/erts/emulator/nifs/unix/unix_prim_file.c b/erts/emulator/nifs/unix/unix_prim_file.c index 57c8ef62e1..4a6c476882 100644 --- a/erts/emulator/nifs/unix/unix_prim_file.c +++ b/erts/emulator/nifs/unix/unix_prim_file.c @@ -125,24 +125,11 @@ static int open_file_type_check(const efile_path_t *path, int fd) { * immediately in a read within the call, but the new implementation * never does that. */ return 1; - } else { - /* The old driver tolerated opening /dev/null despite the "no devices" - * limitation. It provided no explanation for this but we still need - * to match the behavior. We're checking through stat(2) instead of - * comparing the name to account for links. */ - struct stat null_device_info; - int is_dev_null; - - is_dev_null = (stat("/dev/null", &null_device_info) == 0); - is_dev_null &= (file_info.st_ino == null_device_info.st_ino); - is_dev_null &= (file_info.st_dev == null_device_info.st_dev); - - if(is_dev_null) { - return 1; - } } - if(!S_ISREG(file_info.st_mode)) { + /* Allow everything that isn't a directory, and error out on the next call + * if it's unsupported. */ + if(S_ISDIR(file_info.st_mode)) { return 0; } |