From d91505837356c70dca805a2f11df76364cba0620 Mon Sep 17 00:00:00 2001 From: GamesTrap Date: Tue, 23 Sep 2025 19:36:06 +0200 Subject: [PATCH] Fix crash on big-endian systems when calling _glfwAppendDictDataDBusPOSIX() See https://github.com/libsdl-org/SDL/pull/14029 for reference --- src/posix_dbus.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++-- src/posix_dbus.h | 21 +++++++++++++++++++- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/posix_dbus.c b/src/posix_dbus.c index a6c7a858f..eb783684b 100644 --- a/src/posix_dbus.c +++ b/src/posix_dbus.c @@ -35,6 +35,7 @@ #include #include #include +#include void _glfwInitDBusPOSIX(void) { @@ -436,7 +437,9 @@ dbus_bool_t _glfwAppendDictDataDBusPOSIX(struct DBusMessageIter* iterator, int k if(!_glfwAppendDataDBusPOSIX(&keyIterator, keyType, keyData)) return GLFW_FALSE; - if(!_glfwOpenContainerDBusPOSIX(&keyIterator, DBUS_TYPE_VARIANT, (const char*)&valueType, &valueIterator)) + char* valueTypeStr = _glfwDBusTypeToStrPOSIX(valueType); + assert(valueTypeStr != NULL); + if(!_glfwOpenContainerDBusPOSIX(&keyIterator, DBUS_TYPE_VARIANT, valueTypeStr, &valueIterator)) return GLFW_FALSE; //Append value data @@ -470,4 +473,47 @@ dbus_bool_t _glfwSendMessageDBusPOSIX(struct DBusMessage* message) dbus_connection_flush(_glfw.dbus.connection); return GLFW_TRUE; -} \ No newline at end of file +} + +char* _glfwDBusTypeToStrPOSIX(int valueType) +{ + switch (valueType) + { + case DBUS_TYPE_STRING: + return DBUS_TYPE_STRING_AS_STRING; + case DBUS_TYPE_ARRAY: + return DBUS_TYPE_ARRAY_AS_STRING; + case DBUS_TYPE_DICT_ENTRY: + return DBUS_TYPE_DICT_ENTRY_AS_STRING; + case DBUS_TYPE_VARIANT: + return DBUS_TYPE_VARIANT_AS_STRING; + case DBUS_TYPE_BOOLEAN: + return DBUS_TYPE_BOOLEAN_AS_STRING; + case DBUS_TYPE_DOUBLE: + return DBUS_TYPE_DOUBLE_AS_STRING; + case DBUS_TYPE_INT16: + return DBUS_TYPE_INT16_AS_STRING; + case DBUS_TYPE_UINT16: + return DBUS_TYPE_UINT16_AS_STRING; + case DBUS_TYPE_INT32: + return DBUS_TYPE_INT32_AS_STRING; + case DBUS_TYPE_UINT32: + return DBUS_TYPE_UINT32_AS_STRING; + case DBUS_TYPE_INT64: + return DBUS_TYPE_INT64_AS_STRING; + case DBUS_TYPE_UINT64: + return DBUS_TYPE_UINT64_AS_STRING; + case DBUS_TYPE_STRUCT_OPEN: + return DBUS_TYPE_STRUCT_OPEN_AS_STRING; + case DBUS_TYPE_STRUCT_CLOSE: + return DBUS_TYPE_STRUCT_CLOSE_AS_STRING; + case DBUS_TYPE_BYTE: + return DBUS_TYPE_BYTE_AS_STRING; + case DBUS_TYPE_OBJECT_PATH: + return DBUS_TYPE_OBJECT_PATH_AS_STRING; + case DBUS_TYPE_SIGNATURE: + return DBUS_TYPE_SIGNATURE_AS_STRING; + } + + return NULL; +} diff --git a/src/posix_dbus.h b/src/posix_dbus.h index 3adf2bade..d46732ae8 100644 --- a/src/posix_dbus.h +++ b/src/posix_dbus.h @@ -80,6 +80,24 @@ struct DBusMessageIter #define DBUS_TYPE_OBJECT_PATH (unsigned int)'o' #define DBUS_TYPE_SIGNATURE (unsigned int)'g' +#define DBUS_TYPE_STRING_AS_STRING "s" +#define DBUS_TYPE_ARRAY_AS_STRING "a" +#define DBUS_TYPE_DICT_ENTRY_AS_STRING "e" +#define DBUS_TYPE_VARIANT_AS_STRING "v" +#define DBUS_TYPE_BOOLEAN_AS_STRING "b" +#define DBUS_TYPE_DOUBLE_AS_STRING "d" +#define DBUS_TYPE_INT16_AS_STRING "n" +#define DBUS_TYPE_UINT16_AS_STRING "q" +#define DBUS_TYPE_INT32_AS_STRING "i" +#define DBUS_TYPE_UINT32_AS_STRING "u" +#define DBUS_TYPE_INT64_AS_STRING "x" +#define DBUS_TYPE_UINT64_AS_STRING "t" +#define DBUS_TYPE_STRUCT_OPEN_AS_STRING "(" +#define DBUS_TYPE_STRUCT_CLOSE_AS_STRING ")" +#define DBUS_TYPE_BYTE_AS_STRING "y" +#define DBUS_TYPE_OBJECT_PATH_AS_STRING "o" +#define DBUS_TYPE_SIGNATURE_AS_STRING "g" + typedef void (* PFN_dbus_error_init)(struct DBusError*); typedef dbus_bool_t (* PFN_dbus_error_is_set)(const struct DBusError*); typedef void (* PFN_dbus_error_free)(struct DBusError*); @@ -155,4 +173,5 @@ dbus_bool_t _glfwOpenContainerDBusPOSIX(struct DBusMessageIter* iterator, int DB dbus_bool_t _glfwCloseContainerDBusPOSIX(struct DBusMessageIter* iterator, struct DBusMessageIter* subIterator); dbus_bool_t _glfwAppendDataDBusPOSIX(struct DBusMessageIter* iterator, int DBusType, const void* data); dbus_bool_t _glfwAppendDictDataDBusPOSIX(struct DBusMessageIter* iterator, int keyType, const void* keyData, int valueType, const void* valueData); -dbus_bool_t _glfwSendMessageDBusPOSIX(struct DBusMessage* message); \ No newline at end of file +dbus_bool_t _glfwSendMessageDBusPOSIX(struct DBusMessage* message); +char* _glfwDBusTypeToStrPOSIX(int valueType);