aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/nifs
diff options
context:
space:
mode:
authorJohn Högberg <[email protected]>2018-02-26 10:28:26 +0100
committerJohn Högberg <[email protected]>2018-02-26 12:16:59 +0100
commit6f120d4ab4fab2231f7475256bcc1eeac2bfe6e5 (patch)
treedc9122196136d411d89b620bd56f901878e224fb /erts/emulator/nifs
parent7914843737e490c49b0918b67a093e68415b3beb (diff)
downloadotp-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/emulator/nifs')
-rw-r--r--erts/emulator/nifs/unix/unix_prim_file.c19
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;
}