diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5b08ec2..de94f00 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -32,7 +32,7 @@ set(CFL_ATOMIC_BUILTINS_LINK_SOURCE " return 0; }") -if(MSVC) +if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") set(PLATFORM_SPECIFIC_ATOMIC_MODULE cfl_atomic_msvc.c) elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") set(PLATFORM_SPECIFIC_ATOMIC_MODULE cfl_atomic_clang.c) @@ -64,7 +64,7 @@ if(CFL_ATOMIC_USES_BUILTINS) if(CFL_ATOMIC_BUILTINS_LINK_WITH_LIBATOMIC) set(CFL_ATOMIC_NEEDS_LIBATOMIC On) - elseif(CFL_SYSTEM_WINDOWS) + elseif(CFL_SYSTEM_WINDOWS AND "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") set(PLATFORM_SPECIFIC_ATOMIC_MODULE cfl_atomic_msvc.c) else() set(PLATFORM_SPECIFIC_ATOMIC_MODULE cfl_atomic_generic.c) diff --git a/src/cfl_container.c b/src/cfl_container.c index 3b34633..41fb484 100644 --- a/src/cfl_container.c +++ b/src/cfl_container.c @@ -482,6 +482,10 @@ int cfl_container_move_variant_to_array(struct cfl_array *array, return -1; } + if (variant->owned) { + return -1; + } + if (variant->type == CFL_VARIANT_ARRAY) { child_array = variant->data.as_array; @@ -529,6 +533,10 @@ int cfl_container_move_variant_to_kvlist(struct cfl_kvlist *kvlist, return -1; } + if (variant->owned) { + return -1; + } + if (variant->type == CFL_VARIANT_ARRAY) { child_array = variant->data.as_array; diff --git a/tests/array.c b/tests/array.c index 64f1c31..2709601 100644 --- a/tests/array.c +++ b/tests/array.c @@ -389,6 +389,47 @@ static void append_rejects_shared_array_between_parents() cfl_array_destroy(arr_a); } +static void append_rejects_owned_value() +{ + int ret; + struct cfl_array *arr_a; + struct cfl_array *arr_b; + struct cfl_variant *value; + + arr_a = cfl_array_create(1); + if (!TEST_CHECK(arr_a != NULL)) { + return; + } + + arr_b = cfl_array_create(1); + if (!TEST_CHECK(arr_b != NULL)) { + cfl_array_destroy(arr_a); + return; + } + + value = cfl_variant_create_from_string("value"); + if (!TEST_CHECK(value != NULL)) { + cfl_array_destroy(arr_b); + cfl_array_destroy(arr_a); + return; + } + + ret = cfl_array_append(arr_a, value); + if (!TEST_CHECK(ret == 0)) { + cfl_variant_destroy(value); + cfl_array_destroy(arr_b); + cfl_array_destroy(arr_a); + return; + } + + ret = cfl_array_append(arr_b, value); + TEST_CHECK(ret == -1); + TEST_CHECK(cfl_array_size(arr_b) == 0); + + cfl_array_destroy(arr_b); + cfl_array_destroy(arr_a); +} + static void append_kvlist_rejects_cycles() { int ret; @@ -540,6 +581,7 @@ TEST_LIST = { {"append_array_rejects_cycles", append_array_rejects_cycles}, {"append_variant_rejects_cycles", append_variant_rejects_cycles}, {"append_rejects_shared_array_between_parents", append_rejects_shared_array_between_parents}, + {"append_rejects_owned_value", append_rejects_owned_value}, {"append_kvlist_rejects_cycles", append_kvlist_rejects_cycles}, {"remove_by_index", remove_by_index}, {"remove_by_reference", remove_by_reference}, diff --git a/tests/kvlist.c b/tests/kvlist.c index d813169..ac07375 100644 --- a/tests/kvlist.c +++ b/tests/kvlist.c @@ -1252,16 +1252,28 @@ static void print_escaped_keys() struct cfl_kvlist *list; list = cfl_kvlist_create(); - TEST_CHECK(list != NULL); + if (!TEST_CHECK(list != NULL)) { + return; + } ret = cfl_kvlist_insert_string(list, "a\"b\n", "v\n"); - TEST_CHECK(ret == 0); + if (!TEST_CHECK(ret == 0)) { + cfl_kvlist_destroy(list); + return; + } fp = tmpfile(); - TEST_CHECK(fp != NULL); + if (!TEST_CHECK(fp != NULL)) { + cfl_kvlist_destroy(list); + return; + } ret = cfl_kvlist_print(fp, list); - TEST_CHECK(ret > 0); + if (!TEST_CHECK(ret > 0)) { + fclose(fp); + cfl_kvlist_destroy(list); + return; + } ret = compare(fp, "{\"a\\\"b\\n\":\"v\\n\"}"); TEST_CHECK(ret == 0); @@ -1470,7 +1482,7 @@ static void move_taken_value_between_kvlists() cfl_kvlist_destroy(destination); } -static void insert_then_detach_move_compatibility() +static void insert_rejects_owned_value() { int ret; struct cfl_list *head; @@ -1478,7 +1490,6 @@ static void insert_then_detach_move_compatibility() struct cfl_kvlist *destination; struct cfl_kvpair *pair; struct cfl_variant *value; - struct cfl_variant *moved; source = cfl_kvlist_create(); TEST_CHECK(source != NULL); @@ -1494,16 +1505,8 @@ static void insert_then_detach_move_compatibility() value = pair->val; ret = cfl_kvlist_insert(destination, "destination", value); - TEST_CHECK(ret == 0); - - pair->val = NULL; - cfl_kvpair_destroy(pair); - TEST_CHECK(cfl_kvlist_count(source) == 0); - - moved = cfl_kvlist_fetch(destination, "destination"); - TEST_CHECK(moved == value); - TEST_CHECK(moved->type == CFL_VARIANT_STRING); - TEST_CHECK(strcmp(moved->data.as_string, "value") == 0); + TEST_CHECK(ret == -1); + TEST_CHECK(cfl_kvlist_count(destination) == 0); cfl_kvlist_destroy(source); cfl_kvlist_destroy(destination); @@ -1545,6 +1548,6 @@ TEST_LIST = { {"reject_shared_kvlist_between_parents", reject_shared_kvlist_between_parents}, {"reject_array_cycles", reject_array_cycles}, {"move_taken_value_between_kvlists", move_taken_value_between_kvlists}, - {"insert_then_detach_move_compatibility", insert_then_detach_move_compatibility}, + {"insert_rejects_owned_value", insert_rejects_owned_value}, { 0 } };