Fix crash on big-endian systems when calling _glfwAppendDictDataDBusPOSIX()

See https://github.com/libsdl-org/SDL/pull/14029 for reference
This commit is contained in:
GamesTrap 2025-09-23 19:36:06 +02:00
parent 7d23b3c6c1
commit d915058373
No known key found for this signature in database
GPG Key ID: 31DFD452434ECDA3
2 changed files with 68 additions and 3 deletions

View File

@ -35,6 +35,7 @@
#include <unistd.h> #include <unistd.h>
#include <stdio.h> #include <stdio.h>
#include <ctype.h> #include <ctype.h>
#include <assert.h>
void _glfwInitDBusPOSIX(void) void _glfwInitDBusPOSIX(void)
{ {
@ -436,7 +437,9 @@ dbus_bool_t _glfwAppendDictDataDBusPOSIX(struct DBusMessageIter* iterator, int k
if(!_glfwAppendDataDBusPOSIX(&keyIterator, keyType, keyData)) if(!_glfwAppendDataDBusPOSIX(&keyIterator, keyType, keyData))
return GLFW_FALSE; 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; return GLFW_FALSE;
//Append value data //Append value data
@ -471,3 +474,46 @@ dbus_bool_t _glfwSendMessageDBusPOSIX(struct DBusMessage* message)
return GLFW_TRUE; return GLFW_TRUE;
} }
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;
}

View File

@ -80,6 +80,24 @@ struct DBusMessageIter
#define DBUS_TYPE_OBJECT_PATH (unsigned int)'o' #define DBUS_TYPE_OBJECT_PATH (unsigned int)'o'
#define DBUS_TYPE_SIGNATURE (unsigned int)'g' #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 void (* PFN_dbus_error_init)(struct DBusError*);
typedef dbus_bool_t (* PFN_dbus_error_is_set)(const struct DBusError*); typedef dbus_bool_t (* PFN_dbus_error_is_set)(const struct DBusError*);
typedef void (* PFN_dbus_error_free)(struct DBusError*); typedef void (* PFN_dbus_error_free)(struct DBusError*);
@ -156,3 +174,4 @@ dbus_bool_t _glfwCloseContainerDBusPOSIX(struct DBusMessageIter* iterator, struc
dbus_bool_t _glfwAppendDataDBusPOSIX(struct DBusMessageIter* iterator, int DBusType, const void* data); 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 _glfwAppendDictDataDBusPOSIX(struct DBusMessageIter* iterator, int keyType, const void* keyData, int valueType, const void* valueData);
dbus_bool_t _glfwSendMessageDBusPOSIX(struct DBusMessage* message); dbus_bool_t _glfwSendMessageDBusPOSIX(struct DBusMessage* message);
char* _glfwDBusTypeToStrPOSIX(int valueType);