From: Ryan Lortie Date: Wed, 3 Dec 2014 22:13:43 +0000 (-0500) Subject: GBytes: two memfd tweaks X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=ba446f6c333a4646f7cdbbba4855a7af512f0a6f;p=platform%2Fupstream%2Fglib.git GBytes: two memfd tweaks 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 --- diff --git a/glib/gbytes.c b/glib/gbytes.c index 266e257..9d89139 100644 --- a/glib/gbytes.c +++ b/glib/gbytes.c @@ -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));