summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/providers/ldap/sdap_async_initgroups_ad.c25
-rw-r--r--src/tests/cmocka/test_string_utils.c49
-rw-r--r--src/tests/cmocka/test_utils.c1
-rw-r--r--src/tests/cmocka/test_utils.h1
-rw-r--r--src/util/string_utils.c21
-rw-r--r--src/util/util.h4
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;