]> granicus.if.org Git - p11-kit/commitdiff
Fix handling of mmap failure and mapping empty files
authorPascal Terjan <pterjan@google.com>
Sun, 9 Feb 2014 23:39:20 +0000 (23:39 +0000)
committerStef Walter <stef@thewalter.net>
Thu, 13 Feb 2014 07:23:16 +0000 (08:23 +0100)
Check the return value of mmap() correctly.

Empty files cannot be mmap'd so we implement some
work around code for that.

https://bugs.freedesktop.org/show_bug.cgi?id=74773

Signed-off-by: Stef Walter <stef@thewalter.net>
common/compat.c
common/tests/test-compat.c

index 9aa556a4f6c09d752d30f61227ed35b305103977..f5b88ecda47a0061effbb691e1be85e277b8f8a6 100644 (file)
@@ -216,9 +216,15 @@ p11_mmap_open (const char *path,
                return NULL;
        }
 
+       if (sb->st_size == 0) {
+               *data = "";
+               *size = 0;
+               return map;
+       }
+
        map->size = sb->st_size;
        map->data = mmap (NULL, map->size, PROT_READ, MAP_PRIVATE, map->fd, 0);
-       if (map->data == NULL) {
+       if (map->data == MAP_FAILED) {
                close (map->fd);
                free (map);
                return NULL;
@@ -232,7 +238,8 @@ p11_mmap_open (const char *path,
 void
 p11_mmap_close (p11_mmap *map)
 {
-       munmap (map->data, map->size);
+       if (map->size)
+               munmap (map->data, map->size);
        close (map->fd);
        free (map);
 }
index 872170d43e7eed1dc4359e50642fc51c249e9769..42471ae272d0047c0848422f06c27996a4f67351 100644 (file)
@@ -83,6 +83,22 @@ test_getauxval (void)
        free (path);
 }
 
+static void
+test_mmap (void)
+{
+       p11_mmap *map;
+       void *data;
+       size_t size;
+       char file[] = "emptyfileXXXXXX";
+       int fd = mkstemp (file);
+       close (fd);
+       /* mmap on empty file should work */
+       map = p11_mmap_open (file, NULL, &data, &size);
+       unlink (file);
+       assert_ptr_not_null (map);
+       p11_mmap_close (map);
+}
+
 #endif /* OS_UNIX */
 
 int
@@ -95,6 +111,7 @@ main (int argc,
        if (!getenv ("FAKED_MODE")) {
                p11_test (test_getauxval, "/compat/getauxval");
        }
+       p11_test (test_mmap, "/compat/mmap");
 #endif
        return p11_test_run (argc, argv);
 }