GBytes: two memfd tweaks
authorRyan Lortie <desrt@desrt.ca>
Wed, 3 Dec 2014 22:13:43 +0000 (17:13 -0500)
committerMaciej Wereski <m.wereski@partner.samsung.com>
Fri, 10 Jul 2015 09:47:43 +0000 (11:47 +0200)
 1) mmap() of a 0-sized region is EINVAL, so don't try that

 2) MAP_SHARED on a sealed memfd fails for some reason, so use
    MAP_PRIVATE instead

glib/gbytes.c

index 266e257..9d89139 100644 (file)
@@ -200,8 +200,15 @@ g_bytes_new_take_zero_copy_fd (gint fd)
   /* We already checked this is a memfd... */
   g_assert_se (fstat (fd, &buf) == 0);
 
+  if (buf.st_size == 0)
+    {
+      g_assert_se (close (fd) == 0);
+
+      return g_bytes_new (NULL, 0);
+    }
+
   bytes = g_bytes_allocate (sizeof (GBytesData), fd, buf.st_size);
-  bytes->data = mmap (NULL, buf.st_size, PROT_READ, MAP_SHARED, fd, 0);
+  bytes->data = mmap (NULL, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
   if (bytes->data == MAP_FAILED)
     /* this is similar to malloc() failing, so do the same... */
     g_error ("mmap() on memfd failed: %s\n", g_strerror (errno));