diff options
-rw-r--r-- | src/providers/ldap/sdap_async_initgroups_ad.c | 25 | ||||
-rw-r--r-- | src/tests/cmocka/test_string_utils.c | 49 | ||||
-rw-r--r-- | src/tests/cmocka/test_utils.c | 1 | ||||
-rw-r--r-- | src/tests/cmocka/test_utils.h | 1 | ||||
-rw-r--r-- | src/util/string_utils.c | 21 | ||||
-rw-r--r-- | src/util/util.h | 4 |
6 files changed, 76 insertions, 25 deletions
diff --git a/src/providers/ldap/sdap_async_initgroups_ad.c b/src/providers/ldap/sdap_async_initgroups_ad.c index bf368825b..92cedb05f 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 4832015a5..57e6f2617 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 996d99ea0..3aea17f36 100644 --- a/src/tests/cmocka/test_utils.c +++ b/src/tests/cmocka/test_utils.c @@ -1545,6 +1545,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 8b5163165..e93e0da25 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 b6037621e..5e43bbef3 100644 --- a/src/util/string_utils.c +++ b/src/util/string_utils.c @@ -125,3 +125,24 @@ 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 05ee87584..11054c106 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -543,6 +543,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; |