From 5c096e9ddbdd8647b7e95569be54bc03cdacd034 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 23 Oct 2008 13:12:33 +0000 Subject: [PATCH] * Fix bug with string included in a list found by Viktor Kojouharov. * Add a test case for that one. Problem was simple type inlining in complex structure (like list/hash/array) is just a hack. We are creating a subtype with the data chunk. That work with INT or SHORT for example, but not with STRING because it's a pointer to a STRING and not directly the STRING. This result in a double pointer dereferencing where it shouldn't. In fact STRING is not really like other simple data type. So we should handle it differently. Still need to fix Array and Hash. SVN revision: 37024 --- legacy/eet/src/lib/eet_data.c | 39 ++++++++++++++++++++++++-------- legacy/eet/src/tests/eet_suite.c | 17 ++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/legacy/eet/src/lib/eet_data.c b/legacy/eet/src/lib/eet_data.c index 8f63940c09..92a93abfb5 100644 --- a/legacy/eet/src/lib/eet_data.c +++ b/legacy/eet/src/lib/eet_data.c @@ -1124,7 +1124,7 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd, */ if (group_type > EET_G_UNKNOWN && group_type < EET_G_LAST - && type != EET_T_UNKNOW + && type > EET_T_UNKNOW && type < EET_T_STRING && subtype == NULL) { subtype = calloc(1, sizeof (Eet_Data_Descriptor)); @@ -2555,14 +2555,25 @@ eet_data_get_list(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E void **ptr; void *data_ret; - EET_ASSERT(!IS_SIMPLE_TYPE(type), return 0); + EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0); ptr = (void **)data; list = *ptr; data_ret = NULL; - data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata); - if (!data_ret) return 0; + if (ede->type >= EET_T_STRING) + { + int ret; + + ret = eet_data_get_unknown(ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN, + &data_ret, level, dumpfunc, dumpdata, p, size); + if (!ret) return 0; + } + else + { + data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata); + if (!data_ret) return 0; + } list = edd->func.list_append(list, data_ret); *ptr = list; @@ -2832,16 +2843,24 @@ eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element void *l; int size; - EET_ASSERT(!IS_SIMPLE_TYPE(ede->type), return ); + EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return ); l = *((void **)(((char *)data_in))); for (; l; l = edd->func.list_next(l)) { - data = _eet_data_descriptor_encode(ed, - ede->subtype, - edd->func.list_data(l), - &size); - if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + if (ede->type >= EET_T_STRING) + { + const char *str = edd->func.list_data(l); + eet_data_put_unknown(ed, NULL, ede, ds, &str); + } + else + { + data = _eet_data_descriptor_encode(ed, + ede->subtype, + edd->func.list_data(l), + &size); + if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type); + } } } diff --git a/legacy/eet/src/tests/eet_suite.c b/legacy/eet/src/tests/eet_suite.c index 400536a3b7..631fd6bf1f 100644 --- a/legacy/eet/src/tests/eet_suite.c +++ b/legacy/eet/src/tests/eet_suite.c @@ -280,6 +280,7 @@ struct _Eet_Test_Ex_Type Eina_List *list; Eina_Hash *hash; Eina_List *ilist; + Eina_List *slist; Eina_Hash *ihash; Eet_Test_Basic_Type sarray1[10]; unsigned int sarray2[5]; @@ -346,6 +347,9 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd) eet_data_descriptor_element_add(edd, "ihash", EET_T_INT, EET_G_HASH, (char *)(&(etbt.ihash)) - (char *)(&(etbt)), 0, /* 0, */NULL, NULL); + eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST, + (char *)(&(etbt.slist)) - (char *)(&(etbt)), + 0, /* 0, */NULL, NULL); } static Eet_Test_Ex_Type* @@ -374,6 +378,7 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset) res->hash = NULL; res->ilist = NULL; res->ihash = NULL; + res->slist = NULL; res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10); res->varray1 = malloc(sizeof (int) * 5); @@ -490,6 +495,7 @@ START_TEST(eet_test_data_type_encoding_decoding) etbt.ilist = eina_list_prepend(etbt.ilist, &i42); etbt.ihash = eina_hash_string_superfast_new(NULL); eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7); + etbt.slist = eina_list_prepend(NULL, strdup("test")); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -510,6 +516,8 @@ START_TEST(eet_test_data_type_encoding_decoding) fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(eina_list_data_get(result->slist) == NULL); + fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test); @@ -564,6 +572,7 @@ START_TEST(eet_test_data_type_dump_undump) eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7); etbt.ihash = eina_hash_string_superfast_new(NULL); eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7); + etbt.slist = eina_list_prepend(NULL, strdup("test")); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -598,6 +607,8 @@ START_TEST(eet_test_data_type_dump_undump) fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(eina_list_data_get(result->slist) == NULL); + fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test); @@ -696,6 +707,7 @@ START_TEST(eet_file_data_test) eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7); etbt.ihash = eina_hash_string_superfast_new(NULL); eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7); + etbt.slist = eina_list_prepend(NULL, strdup("test")); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -761,6 +773,8 @@ START_TEST(eet_file_data_test) fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(eina_list_data_get(result->slist) == NULL); + fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test); @@ -826,6 +840,7 @@ START_TEST(eet_file_data_dump_test) eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7); etbt.ihash = eina_hash_string_superfast_new(NULL); eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7); + etbt.slist = eina_list_prepend(NULL, strdup("test")); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -871,6 +886,8 @@ START_TEST(eet_file_data_dump_test) fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0); fail_if(eina_list_data_get(result->ilist) == NULL); fail_if(*((int*)eina_list_data_get(result->ilist)) != 42); + fail_if(eina_list_data_get(result->slist) == NULL); + fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test);