]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
Fix dbus message reading code on big endian hosts
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 29 Jul 2013 16:29:00 +0000 (17:29 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 29 Jul 2013 17:08:55 +0000 (18:08 +0100)
The way we were casting small (<32bit) integers was broken
on big endian hosts, causing stack smashing. This was detected
in the test suite either by test failures due to incorrect
results, or by libc/gcc abort'ing with its stack canary
triggered.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/util/virdbus.c
tests/virdbustest.c

index 8f724e941fe19520221fb10b0d225602e323967c..e88dc267b910e64a617563ce565163556dcd8267 100644 (file)
@@ -738,7 +738,7 @@ virDBusMessageIterDecode(DBusMessageIter *rootiter,
 
         switch (*t) {
         case DBUS_TYPE_BYTE:
-            GET_NEXT_VAL(unsigned char, int, "%d");
+            GET_NEXT_VAL(unsigned char, unsigned char, "%d");
             break;
 
         case DBUS_TYPE_BOOLEAN:
@@ -746,11 +746,11 @@ virDBusMessageIterDecode(DBusMessageIter *rootiter,
             break;
 
         case DBUS_TYPE_INT16:
-            GET_NEXT_VAL(dbus_int16_t, int, "%d");
+            GET_NEXT_VAL(dbus_int16_t, short, "%d");
             break;
 
         case DBUS_TYPE_UINT16:
-            GET_NEXT_VAL(dbus_uint16_t, unsigned int, "%d");
+            GET_NEXT_VAL(dbus_uint16_t, unsigned short, "%d");
             break;
 
         case DBUS_TYPE_INT32:
index fb241eec81358b3b3a47519fcb56a2f4102da0f0..61de93700165d58b5ff980e0a2220cb1d3482dc2 100644 (file)
@@ -54,8 +54,8 @@ static int testMessageSimple(const void *args ATTRIBUTE_UNUSED)
     int ret = -1;
     unsigned char in_byte = 200, out_byte = 0;
     int in_bool = true, out_bool = false;
-    int in_int16 = 12000, out_int16 = 0;
-    unsigned int in_uint16 = 32000, out_uint16 = 0;
+    short in_int16 = 0xfefe, out_int16 = 0;
+    unsigned short in_uint16 = 32000, out_uint16 = 0;
     int in_int32 = 100000000, out_int32 = 0;
     unsigned int in_uint32 = 200000000, out_uint32 = 0;
     long long in_int64 = 1000000000000, out_int64 = 0;
@@ -232,8 +232,8 @@ static int testMessageStruct(const void *args ATTRIBUTE_UNUSED)
     int ret = -1;
     unsigned char in_byte = 200, out_byte = 0;
     int in_bool = true, out_bool = false;
-    int in_int16 = 12000, out_int16 = 0;
-    unsigned int in_uint16 = 32000, out_uint16 = 0;
+    short in_int16 = 12000, out_int16 = 0;
+    unsigned short in_uint16 = 32000, out_uint16 = 0;
     int in_int32 = 100000000, out_int32 = 0;
     unsigned int in_uint32 = 200000000, out_uint32 = 0;
     long long in_int64 = 1000000000000, out_int64 = 0;