diff --git a/src/detection/displayserver/linux/wayland/kde-output.c b/src/detection/displayserver/linux/wayland/kde-output.c index 232b47892..8d7ab51ab 100644 --- a/src/detection/displayserver/linux/wayland/kde-output.c +++ b/src/detection/displayserver/linux/wayland/kde-output.c @@ -228,7 +228,7 @@ static void waylandKdeOutputOrderListener(void *data, FF_MAYBE_UNUSED struct kde { uint64_t* id = (uint64_t*) data; if (*id == 0) - strncpy((char*) id, output_name, sizeof(*id)); + *id = ffWaylandGenerateIdFromName(output_name); } void ffWaylandHandleKdeOutputOrder(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version) diff --git a/src/detection/displayserver/linux/wayland/wayland.c b/src/detection/displayserver/linux/wayland/wayland.c index a98f7f5cd..660e42771 100644 --- a/src/detection/displayserver/linux/wayland/wayland.c +++ b/src/detection/displayserver/linux/wayland/wayland.c @@ -140,7 +140,7 @@ void ffWaylandOutputNameListener(void* data, FF_MAYBE_UNUSED void* output, const display->type = FF_DISPLAY_TYPE_EXTERNAL; if (!display->edidName.length) ffdsMatchDrmConnector(name, &display->edidName); - strncpy((char*) &display->id, name, sizeof(display->id)); + display->id = ffWaylandGenerateIdFromName(name); ffStrbufAppendS(&display->name, name); } diff --git a/src/detection/displayserver/linux/wayland/wayland.h b/src/detection/displayserver/linux/wayland/wayland.h index a997b4e5f..21f1979c3 100644 --- a/src/detection/displayserver/linux/wayland/wayland.h +++ b/src/detection/displayserver/linux/wayland/wayland.h @@ -52,6 +52,17 @@ inline static void stubListener(void* data, ...) (void) data; } +inline static uint64_t ffWaylandGenerateIdFromName(const char* name) +{ + uint64_t id = 0; + size_t len = strlen(name); + if (len > sizeof(id)) + memcpy(&id, name + (len - sizeof(id)), sizeof(id)); // copy the last 8 bytes + else if (len > 0) + memcpy(&id, name, len); + return id; +} + void ffWaylandOutputNameListener(void* data, FF_MAYBE_UNUSED void* output, const char *name); void ffWaylandOutputDescriptionListener(void* data, FF_MAYBE_UNUSED void* output, const char* description);