From 6ea468c823c7ebec5137f9c24fd3a4de37a395da Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 24 Jul 2024 09:41:08 +1000 Subject: [PATCH] util/memfile: use MAP_SHARED to create the map Using MAP_PRIVATE means copy-on-write so our data written into the map immediately disappears again. This leads to a empty string when sending a keymap to a client. --- src/util-memfile.c | 2 +- test/test-ei-device.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/util-memfile.c b/src/util-memfile.c index 223199a..da72600 100644 --- a/src/util-memfile.c +++ b/src/util-memfile.c @@ -78,7 +78,7 @@ memfile_new(const char *data, size_t sz) { memfile->size = sz; fd = -1; - void *map = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE, memfile->fd, 0); + void *map = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_SHARED, memfile->fd, 0); if (map == MAP_FAILED) return NULL; diff --git a/test/test-ei-device.c b/test/test-ei-device.c index 182f1a1..b8c240a 100644 --- a/test/test-ei-device.c +++ b/test/test-ei-device.c @@ -31,11 +31,13 @@ #include "util-io.h" #include "util-munit.h" #include "util-memfile.h" +#include "util-memmap.h" #include "eierpecken.h" #if HAVE_MEMFD_CREATE DEFINE_UNREF_CLEANUP_FUNC(memfile); +DEFINE_UNREF_CLEANUP_FUNC(memmap); #endif MUNIT_TEST(test_ei_device_basics) @@ -1295,7 +1297,11 @@ MUNIT_TEST(test_ei_keymap_set) munit_assert_int(fd, !=, -1); munit_assert_uint(ei_keymap_get_size(ei_keymap), ==, memfile_get_size(fd1)); munit_assert_uint(ei_keymap_get_type(ei_keymap), ==, EI_KEYMAP_TYPE_XKB); - /* FIXME: read and compare buffer */ + + _unref_(memmap) *keymap = memmap_new(ei_keymap_get_fd(ei_keymap), + ei_keymap_get_size(ei_keymap)); + char *buf = memmap_get_data(keymap); + munit_assert_true(memcmp(buf, data, memmap_get_size(keymap)) == 0); ei_device_close(ei_device); }