Jelajahi Sumber

Kernel: open() and openat() should ignore non-permission bits in mode

Andreas Kling 5 tahun lalu
induk
melakukan
e1d4b19461
2 mengubah file dengan 25 tambahan dan 0 penghapusan
  1. 6 0
      Kernel/Process.cpp
  2. 19 0
      Userland/test_io.cpp

+ 6 - 0
Kernel/Process.cpp

@@ -1652,6 +1652,9 @@ int Process::sys$open(const Syscall::SC_open_params* user_params)
     if (!validate_read(params.path, params.path_length))
         return -EFAULT;
 
+    // Ignore everything except permission bits.
+    mode &= 04777;
+
     String path = copy_string_from_user(params.path, params.path_length);
     int fd = alloc_fd();
 #ifdef DEBUG_IO
@@ -1681,6 +1684,9 @@ int Process::sys$openat(const Syscall::SC_openat_params* user_params)
     int options = params.options;
     u16 mode = params.mode;
 
+    // Ignore everything except permission bits.
+    mode &= 04777;
+
     if (params.path_length <= 0)
         return -EINVAL;
     if (!validate_read(params.path, params.path_length))

+ 19 - 0
Userland/test_io.cpp

@@ -156,6 +156,24 @@ void test_procfs_read_past_end()
     close(fd);
 }
 
+void test_open_create_device()
+{
+    int fd = open("/tmp/fakedevice", (O_RDWR | O_CREAT), (S_IFCHR | 0600));
+    ASSERT(fd >= 0);
+
+    struct stat st;
+    if (fstat(fd, &st) < 0) {
+        perror("stat");
+        ASSERT_NOT_REACHED();
+    }
+
+    if (st.st_mode != 0100600) {
+        fprintf(stderr, "Expected mode 0100600 after attempt to create a device node with open(O_CREAT), mode=%o\n", st.st_mode);
+    }
+    unlink("/tmp/fakedevice");
+    close(fd);
+}
+
 int main(int, char**)
 {
     int rc;
@@ -177,6 +195,7 @@ int main(int, char**)
     test_mmap_directory();
     test_tmpfs_read_past_end();
     test_procfs_read_past_end();
+    test_open_create_device();
 
     return 0;
 }