From d3a5c55b8244d5985273e854837be21d76a593bb Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Wed, 17 Feb 2016 13:04:03 +0100 Subject: [PATCH 3/8] util: make concatenate_string_array() reusable --- src/providers/ldap/sdap_async_initgroups_ad.c | 25 -------------- src/tests/cmocka/test_string_utils.c | 49 +++++++++++++++++++++++++++ src/tests/cmocka/test_utils.c | 1 + src/tests/cmocka/test_utils.h | 1 + src/util/string_utils.c | 22 ++++++++++++ src/util/util.h | 4 +++ 6 files changed, 77 insertions(+), 25 deletions(-) diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c b/src/providers/ldap/sdap_async_initgroups_ad.c index bf368825befb19d49f80af4ea46a6fc6bc7de039..92cedb05f75b9d61ccfce07a396d7086fa51cc32 100644 --- a/src/providers/ldap/sdap_async_initgroups_ad.c +++ b/src/providers/ldap/sdap_async_initgroups_ad.c @@ -1338,10 +1338,6 @@ done: tevent_req_done(req); } -static char **concatenate_string_array(TALLOC_CTX *mem_ctx, - char **arr1, size_t len1, - char **arr2, size_t len2); - static void sdap_ad_tokengroups_initgr_posix_sids_done(struct tevent_req *subreq) { @@ -1404,27 +1400,6 @@ done: tevent_req_done(req); } -static char **concatenate_string_array(TALLOC_CTX *mem_ctx, - char **arr1, size_t len1, - char **arr2, size_t len2) -{ - size_t i, j; - size_t new_size = len1 + len2; - char ** string_array = talloc_realloc(mem_ctx, arr1, char *, new_size + 1); - if (string_array == NULL) { - return NULL; - } - - for (i=len1, j=0; i < new_size; ++i,++j) { - string_array[i] = talloc_steal(string_array, - arr2[j]); - } - - string_array[i] = NULL; - - return string_array; -} - static errno_t sdap_ad_tokengroups_initgr_posix_recv(struct tevent_req *req) { TEVENT_REQ_RETURN_ON_ERROR(req); diff --git a/src/tests/cmocka/test_string_utils.c b/src/tests/cmocka/test_string_utils.c index 4832015a5a43ece2c9d476f2a3974d46116ebfce..57e6f2617b9c122d4734b7c0ad2a82a2f55ff606 100644 --- a/src/tests/cmocka/test_string_utils.c +++ b/src/tests/cmocka/test_string_utils.c @@ -220,3 +220,52 @@ void test_get_last_x_chars(void **state) assert_non_null(s); assert_string_equal(s, "abc"); } + +void test_concatenate_string_array(void **state) +{ + TALLOC_CTX *mem_ctx; + char **a1; + size_t a1_len = 2; + char **a2; + size_t a2_len = 3; + char **res; + size_t c; + + mem_ctx = talloc_new(NULL); + assert_non_null(mem_ctx); + check_leaks_push(mem_ctx); + + res = concatenate_string_array(mem_ctx, NULL, 0, NULL, 0); + assert_non_null(res); + assert_null(res[0]); + talloc_free(res); + + a1 = talloc_array(mem_ctx, char *, a1_len); + assert_non_null(a1); + for (c = 0; c < a1_len; c++) { + a1[c] = talloc_asprintf(a1, "%zu", c); + assert_non_null(a1[c]); + } + + a2 = talloc_array(mem_ctx, char *, a2_len); + assert_non_null(a2); + for (c = 0; c < a2_len; c++) { + a2[c] = talloc_asprintf(a2, "%zu", c + a1_len); + assert_non_null(a2[c]); + } + + res = concatenate_string_array(mem_ctx, a1, a1_len, a2, a2_len); + assert_non_null(res); + assert_null(res[a1_len + a2_len]); + for (c = 0; c < (a1_len + a2_len); c++) { + assert_string_equal(res[c], talloc_asprintf(res, "%zu", c)); + } + + talloc_free(res); + /* Since concatenate_string_array() uses talloc_realloc on a1 it should + * not be needed to free a1 explicitly. */ + talloc_free(a2); + + assert_true(check_leaks_pop(mem_ctx) == true); + talloc_free(mem_ctx); +} diff --git a/src/tests/cmocka/test_utils.c b/src/tests/cmocka/test_utils.c index fecc5579d85490a62641e3f7d5db22639fc5ed26..cd542446e0835d7f646f6727590b3846ec45f14f 100644 --- a/src/tests/cmocka/test_utils.c +++ b/src/tests/cmocka/test_utils.c @@ -1549,6 +1549,7 @@ int main(int argc, const char *argv[]) cmocka_unit_test(test_reverse_replace_whitespaces), cmocka_unit_test(test_guid_blob_to_string_buf), cmocka_unit_test(test_get_last_x_chars), + cmocka_unit_test(test_concatenate_string_array), cmocka_unit_test_setup_teardown(test_add_strings_lists, setup_add_strings_lists, teardown_add_strings_lists), diff --git a/src/tests/cmocka/test_utils.h b/src/tests/cmocka/test_utils.h index 8b51631655afaca8a6a6a8a649677a7d0214499d..e93e0da2533c1283f5d19cdafa8731033fa0ca0e 100644 --- a/src/tests/cmocka/test_utils.h +++ b/src/tests/cmocka/test_utils.h @@ -31,5 +31,6 @@ void test_replace_whitespaces(void **state); void test_reverse_replace_whitespaces(void **state); void test_guid_blob_to_string_buf(void **state); void test_get_last_x_chars(void **state); +void test_concatenate_string_array(void **state); #endif /* __TESTS__CMOCKA__TEST_UTILS_H__ */ diff --git a/src/util/string_utils.c b/src/util/string_utils.c index b6037621ec5218d81f37b901386f2918780a1a2d..f5c4d61dcb59d87347ec0a6f816750d468c921c1 100644 --- a/src/util/string_utils.c +++ b/src/util/string_utils.c @@ -125,3 +125,25 @@ const char *get_last_x_chars(const char *str, size_t x) return (str + len - x); } + +char **concatenate_string_array(TALLOC_CTX *mem_ctx, + char **arr1, size_t len1, + char **arr2, size_t len2) +{ + size_t i, j; + size_t new_size = len1 + len2; + char ** string_array = talloc_realloc(mem_ctx, arr1, char *, new_size + 1); + if (string_array == NULL) { + return NULL; + } + + for (i=len1, j=0; i < new_size; ++i,++j) { + string_array[i] = talloc_steal(string_array, + arr2[j]); + } + + string_array[i] = NULL; + + return string_array; +} + diff --git a/src/util/util.h b/src/util/util.h index 5df86b4cb084a01f31f3e11aaf3ffcbe79b996a9..be7b0c087aee0c82f54b512322b9cbbef50f71f0 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -660,6 +660,10 @@ errno_t guid_blob_to_string_buf(const uint8_t *blob, char *str_buf, const char *get_last_x_chars(const char *str, size_t x); +char **concatenate_string_array(TALLOC_CTX *mem_ctx, + char **arr1, size_t len1, + char **arr2, size_t len2); + /* from become_user.c */ errno_t become_user(uid_t uid, gid_t gid); struct sss_creds; -- 2.1.0