Sfoglia il codice sorgente

TmpFS: Reads past the end of a file should be zero-length

Andreas Kling 5 anni fa
parent
commit
28ee5b0e98
2 ha cambiato i file con 23 aggiunte e 0 eliminazioni
  1. 3 0
      Kernel/FileSystem/TmpFS.cpp
  2. 20 0
      Userland/test_io.cpp

+ 3 - 0
Kernel/FileSystem/TmpFS.cpp

@@ -160,6 +160,9 @@ ssize_t TmpFSInode::read_bytes(off_t offset, ssize_t size, u8* buffer, FileDescr
     if (!m_content.has_value())
         return 0;
 
+    if (offset >= m_metadata.size)
+        return 0;
+
     if (static_cast<off_t>(size) > m_metadata.size - offset)
         size = m_metadata.size - offset;
 

+ 20 - 0
Userland/test_io.cpp

@@ -121,6 +121,25 @@ void test_mmap_directory()
     close(fd);
 }
 
+void test_tmpfs_read_past_end()
+{
+    int fd = open("/tmp/x", O_RDWR | O_CREAT | O_TRUNC, 0600);
+    ASSERT(fd >= 0);
+
+    int rc = ftruncate(fd, 1);
+    ASSERT(rc == 0);
+
+    rc = lseek(fd, 4096, SEEK_SET);
+    ASSERT(rc == 4096);
+
+    char buffer[16];
+    int nread = read(fd, buffer, sizeof(buffer));
+    if (nread != 0) {
+        fprintf(stderr, "Expected 0-length read past end of file in /tmp\n");
+    }
+    close(fd);
+}
+
 int main(int, char**)
 {
     int rc;
@@ -140,6 +159,7 @@ int main(int, char**)
     test_ftruncate_readonly();
     test_ftruncate_negative();
     test_mmap_directory();
+    test_tmpfs_read_past_end();
 
     return 0;
 }