Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 8 additions & 0 deletions src/cfl_container.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down
42 changes: 42 additions & 0 deletions tests/array.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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},
Expand Down
37 changes: 20 additions & 17 deletions tests/kvlist.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -1470,15 +1482,14 @@ 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;
struct cfl_kvlist *source;
struct cfl_kvlist *destination;
struct cfl_kvpair *pair;
struct cfl_variant *value;
struct cfl_variant *moved;

source = cfl_kvlist_create();
TEST_CHECK(source != NULL);
Expand All @@ -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);
Expand Down Expand Up @@ -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 }
};
Loading