summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Roberto de Souza <jose.souza@intel.com>2016-01-27 18:32:49 -0200
committerJosé Roberto de Souza <jose.souza@intel.com>2016-02-01 12:50:31 -0200
commit316cf42159305ffcccfbfbdd53645126f944c308 (patch)
tree69b82ff4884697eb3c21cca8f204b2ecb1e2a34f
parentcedeb0c45517b1661e3bff22dae09a307e9ec6cb (diff)
downloadefl-316cf42159305ffcccfbfbdd53645126f944c308.tar.gz
eldbus: Correctly read/write boolean to eina_value
DBus bool type is a uint32_t not a uint8_t, just changing how read and write, not chaging how it is stored in eina_value to save some bytes of RAM. This fix the stack overflow pointed out here: https://phab.enlightenment.org/T3089 @fix
-rw-r--r--src/lib/eldbus/eldbus_message_from_eina_value.c28
-rw-r--r--src/lib/eldbus/eldbus_message_to_eina_value.c17
2 files changed, 40 insertions, 5 deletions
diff --git a/src/lib/eldbus/eldbus_message_from_eina_value.c b/src/lib/eldbus/eldbus_message_from_eina_value.c
index 3d594fb6ab..4280a6b17c 100644
--- a/src/lib/eldbus/eldbus_message_from_eina_value.c
+++ b/src/lib/eldbus/eldbus_message_from_eina_value.c
@@ -118,7 +118,6 @@ _array_append(const char *type, const Eina_Value *value_array, Eldbus_Message_It
}
break;
}
- case 'b'://boolean
case 'y'://byte
{
unsigned char z;
@@ -130,6 +129,17 @@ _array_append(const char *type, const Eina_Value *value_array, Eldbus_Message_It
}
break;
}
+ case 'b'://boolean
+ {
+ unsigned char z;
+ unsigned i;
+ for (i = 0; i < eina_value_array_count(value_array); i++)
+ {
+ eina_value_array_get(value_array, i, &z);
+ eldbus_message_iter_basic_append(array, type[1], (uint32_t)z);
+ }
+ break;
+ }
case 'n'://int16
{
int16_t z;
@@ -230,7 +240,6 @@ _basic_append_value_struct(char type, const Eina_Value *value, const Eina_Value_
eldbus_message_iter_basic_append(iter, type, txt);
break;
}
- case 'b'://boolean
case 'y'://byte
{
unsigned char byte;
@@ -238,6 +247,13 @@ _basic_append_value_struct(char type, const Eina_Value *value, const Eina_Value_
eldbus_message_iter_basic_append(iter, type, byte);
break;
}
+ case 'b'://boolean
+ {
+ unsigned char boolean;
+ eina_value_struct_get(value, desc->members[idx].name, &boolean);
+ eldbus_message_iter_basic_append(iter, type, (uint32_t)boolean);
+ break;
+ }
case 'n'://int16
{
int16_t i;
@@ -395,7 +411,6 @@ _basic_append_value(char type, const Eina_Value *value, Eldbus_Message_Iter *ite
eldbus_message_iter_basic_append(iter, type, txt);
break;
}
- case 'b'://boolean
case 'y'://byte
{
unsigned char byte;
@@ -403,6 +418,13 @@ _basic_append_value(char type, const Eina_Value *value, Eldbus_Message_Iter *ite
eldbus_message_iter_basic_append(iter, type, byte);
break;
}
+ case 'b'://boolean
+ {
+ unsigned char boolean;
+ eina_value_get(value, &boolean);
+ eldbus_message_iter_basic_append(iter, type, (uint32_t)boolean);
+ break;
+ }
case 'n'://int16
{
int16_t i;
diff --git a/src/lib/eldbus/eldbus_message_to_eina_value.c b/src/lib/eldbus/eldbus_message_to_eina_value.c
index 87258bf3d9..32be7ee3c5 100644
--- a/src/lib/eldbus/eldbus_message_to_eina_value.c
+++ b/src/lib/eldbus/eldbus_message_to_eina_value.c
@@ -164,7 +164,6 @@ _message_iter_basic_array_to_eina_value(char type, Eina_Value *value, Eldbus_Mes
eina_value_array_append(value, txt);
break;
}
- case 'b'://boolean
case 'y'://byte
{
unsigned char byte;
@@ -172,6 +171,13 @@ _message_iter_basic_array_to_eina_value(char type, Eina_Value *value, Eldbus_Mes
eina_value_array_append(value, byte);
break;
}
+ case 'b'://boolean
+ {
+ uint32_t boolean;
+ while (eldbus_message_iter_get_and_next(iter, type, &boolean))
+ eina_value_array_append(value, (uint8_t)boolean);
+ break;
+ }
case 'n'://int16
{
int16_t i;
@@ -316,7 +322,6 @@ _message_iter_struct_to_eina_value(Eldbus_Message_Iter *iter)
eina_value_set(v, txt);
break;
}
- case 'b'://boolean
case 'y'://byte
{
unsigned char byte;
@@ -325,6 +330,14 @@ _message_iter_struct_to_eina_value(Eldbus_Message_Iter *iter)
eina_value_set(v, byte);
break;
}
+ case 'b'://boolean
+ {
+ uint32_t value;
+ v = eina_value_new(EINA_VALUE_TYPE_UCHAR);
+ eldbus_message_iter_basic_get(iter, &value);
+ eina_value_set(v, (uint8_t)value);
+ break;
+ }
case 'n'://int16
{
int16_t i;