From ba446f6c333a4646f7cdbbba4855a7af512f0a6f Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Wed, 3 Dec 2014 17:13:43 -0500 Subject: [PATCH] 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 --- glib/gbytes.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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)); -- 2.7.4