From 909dd07ba83d8a7af170f28d6c61d093c4fe92aa Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Mon, 8 Jun 2020 11:00:26 +0900 Subject: [PATCH] eldbus: fix the data size issue. Summary: dbus message requires the void* value for the message data, the returned value of dbus_message_iter_get_basic() can be mismatched by to the architure, This could bring the returned va_argues memory corrupted among the series of values. We can use the defined type for exceptions. Reviewers: herb, kimcinoo, jsuya, raster Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D11940 --- src/lib/eldbus/eldbus_message.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/lib/eldbus/eldbus_message.c b/src/lib/eldbus/eldbus_message.c index e7295077ab..f8605dd9d1 100644 --- a/src/lib/eldbus/eldbus_message.c +++ b/src/lib/eldbus/eldbus_message.c @@ -619,32 +619,36 @@ eldbus_message_iter_next(Eldbus_Message_Iter *iter) static void get_basic(char type, DBusMessageIter *iter, va_list *vl) { + DBusBasicValue val; + switch (type) { case DBUS_TYPE_BYTE: { uint8_t *byte = va_arg(*vl, uint8_t *); - dbus_message_iter_get_basic(iter, byte); + dbus_message_iter_get_basic(iter, &val); + *byte = val.bool_val; break; } case DBUS_TYPE_BOOLEAN: { Eina_Bool *boolean = va_arg(*vl, Eina_Bool *); - dbus_bool_t val; dbus_message_iter_get_basic(iter, &val); - *boolean = val; + *boolean = val.bool_val; break; } case DBUS_TYPE_INT16: { int16_t *int16 = va_arg(*vl, int16_t *); - dbus_message_iter_get_basic(iter, int16); + dbus_message_iter_get_basic(iter, &val); + *int16 = val.i16; break; } case DBUS_TYPE_UINT16: { uint16_t *uint16 = va_arg(*vl, uint16_t *); - dbus_message_iter_get_basic(iter, uint16); + dbus_message_iter_get_basic(iter, &val); + *uint16 = val.u16; break; } case DBUS_TYPE_INT32: @@ -653,31 +657,36 @@ get_basic(char type, DBusMessageIter *iter, va_list *vl) #endif { int32_t *int32 = va_arg(*vl, int32_t *); - dbus_message_iter_get_basic(iter, int32); + dbus_message_iter_get_basic(iter, &val); + *int32 = val.i32; break; } case DBUS_TYPE_UINT32: { uint32_t *uint32 = va_arg(*vl, uint32_t *); - dbus_message_iter_get_basic(iter, uint32); + dbus_message_iter_get_basic(iter, &val); + *uint32 = val.u32; break; } case DBUS_TYPE_INT64: { int64_t *int64 = va_arg(*vl, int64_t *); - dbus_message_iter_get_basic(iter, int64); + dbus_message_iter_get_basic(iter, &val); + *int64 = val.i64; break; } case DBUS_TYPE_UINT64: { uint64_t *uint64 = va_arg(*vl, uint64_t *); - dbus_message_iter_get_basic(iter, uint64); + dbus_message_iter_get_basic(iter, &val); + *uint64 = val.u64; break; } case DBUS_TYPE_DOUBLE: { double *double_ieee = va_arg(*vl, double *); - dbus_message_iter_get_basic(iter, double_ieee); + dbus_message_iter_get_basic(iter, &val); + *double_ieee = val.dbl; break; } case DBUS_TYPE_STRING: @@ -685,7 +694,8 @@ get_basic(char type, DBusMessageIter *iter, va_list *vl) case DBUS_TYPE_SIGNATURE: { char **string = va_arg(*vl, char**); - dbus_message_iter_get_basic(iter, string); + dbus_message_iter_get_basic(iter, &val); + *string = val.str; break; } default: