summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/compat.c11
-rw-r--r--common/tests/test-compat.c17
2 files changed, 26 insertions, 2 deletions
diff --git a/common/compat.c b/common/compat.c
index 9aa556a..f5b88ec 100644
--- a/common/compat.c
+++ b/common/compat.c
@@ -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);
}
diff --git a/common/tests/test-compat.c b/common/tests/test-compat.c
index 872170d..42471ae 100644
--- a/common/tests/test-compat.c
+++ b/common/tests/test-compat.c
@@ -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);
}