diff options
author | Pavel Reichl <preichl@redhat.com> | 2014-07-11 15:21:59 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2014-09-05 11:34:50 +0200 |
commit | 61602026ed8c91efd166000562899670449f1b50 (patch) | |
tree | 0471bd109d97c06e8fed36ce20e65d17767add5b | |
parent | 2344d7f71dd80618a41745b0818b46895fa61b2c (diff) | |
download | sssd-61602026ed8c91efd166000562899670449f1b50.tar.gz sssd-61602026ed8c91efd166000562899670449f1b50.tar.xz sssd-61602026ed8c91efd166000562899670449f1b50.zip |
SYSDB: SSS_LDB_SEARCH - macro around ldb_search
This patch amends previous patch 5153e8b9793dea1e212ca08af0f77ea1d023cbb7.
Macro SSS_LDB_SEARCH is used instead of using fuction sss_ldb_search as
a wrapper around ldb_search which could lead to premature expansion of
variadic parameters.
Part of solution for:
https://fedorahosted.org/sssd/ticket/1991
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
-rw-r--r-- | src/db/sysdb.h | 17 | ||||
-rw-r--r-- | src/db/sysdb_ops.c | 51 | ||||
-rw-r--r-- | src/db/sysdb_search.c | 10 | ||||
-rw-r--r-- | src/tests/sysdb-tests.c | 38 |
4 files changed, 36 insertions, 80 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h index 3cef1e66b..295949cf4 100644 --- a/src/db/sysdb.h +++ b/src/db/sysdb.h @@ -481,11 +481,6 @@ int sysdb_get_netgroup_attr(TALLOC_CTX *mem_ctx, const char **attributes, struct ldb_result **res); -errno_t sss_ldb_search(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, - struct ldb_result **_result, struct ldb_dn *base, - enum ldb_scope scope, const char * const *attrs, - const char *exp_fmt, ...) SSS_ATTRIBUTE_PRINTF(7, 8); - /* functions that modify the databse * they have to be called within a transaction * See sysdb_transaction_send()/_recv() */ @@ -514,6 +509,18 @@ int sysdb_search_entry(TALLOC_CTX *mem_ctx, size_t *_msgs_count, struct ldb_message ***_msgs); +#define SSS_LDB_SEARCH(ret, ldb, mem_ctx, _result, base, scope, attrs, \ + exp_fmt, ...) do { \ + int _sls_lret; \ + \ + _sls_lret = ldb_search(ldb, mem_ctx, _result, base, scope, attrs, \ + exp_fmt, ##__VA_ARGS__); \ + ret = sysdb_error_to_errno(_sls_lret); \ + if (ret == EOK && (*_result)->count == 0) { \ + ret = ENOENT; \ + } \ +} while(0) + /* Search User (by uid, sid or name) */ int sysdb_search_user_by_name(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c index e32d79a70..8a7feaefe 100644 --- a/src/db/sysdb_ops.c +++ b/src/db/sysdb_ops.c @@ -74,57 +74,6 @@ static uint32_t get_attr_as_uint32(struct ldb_message *msg, const char *attr) return l; } - -/* Wrapper around ldb_search to ensure that if zero results are found then - * ENOENT is returned - */ -errno_t sss_ldb_search(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, - struct ldb_result **_result, struct ldb_dn *base, - enum ldb_scope scope, const char * const *attrs, - const char *exp_fmt, ...) -{ - char *s; - int lret; - va_list ap; - errno_t ret; - TALLOC_CTX *tmp_ctx = NULL; - - if (exp_fmt != NULL) { - tmp_ctx = talloc_new(NULL); - if (tmp_ctx == NULL) { - ret = ENOMEM; - goto done; - } - - va_start(ap, exp_fmt); - s = talloc_vasprintf(tmp_ctx, exp_fmt, ap); - va_end(ap); - - if (s == NULL) { - DEBUG(SSSDBG_MINOR_FAILURE, "Failed to process filter.\n"); - ret = ENOMEM; - goto done; - } - lret = ldb_search(ldb, mem_ctx, _result, base, scope, attrs, "%s", s); - } else { - lret = ldb_search(ldb, mem_ctx, _result, base, scope, attrs, NULL); - } - - ret = sysdb_error_to_errno(lret); - if (ret != EOK) { - goto done; - } - - if ((*_result)->count == 0) { - ret = ENOENT; - goto done; - } - -done: - talloc_free(tmp_ctx); - return ret; -} - /* * The wrapper around ldb_modify that uses LDB_CONTROL_PERMISSIVE_MODIFY_OID * so that on adds entries that already exist are skipped and similarly diff --git a/src/db/sysdb_search.c b/src/db/sysdb_search.c index ff14c4a98..3d789ae85 100644 --- a/src/db/sysdb_search.c +++ b/src/db/sysdb_search.c @@ -815,11 +815,11 @@ errno_t sysdb_getnetgr(TALLOC_CTX *mem_ctx, goto done; } - ret = sss_ldb_search(domain->sysdb->ldb, tmp_ctx, &result, base_dn, - LDB_SCOPE_SUBTREE, attrs, - SYSDB_NETGR_TRIPLES_FILTER, lc_sanitized_netgroup, - sanitized_netgroup, sanitized_netgroup, - netgroup_dn); + SSS_LDB_SEARCH(ret, domain->sysdb->ldb, tmp_ctx, &result, base_dn, + LDB_SCOPE_SUBTREE, attrs, + SYSDB_NETGR_TRIPLES_FILTER, lc_sanitized_netgroup, + sanitized_netgroup, sanitized_netgroup, + netgroup_dn); if (ret == EOK || ret == ENOENT) { *res = talloc_steal(mem_ctx, result); diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c index 75495ef3d..5ab8b6614 100644 --- a/src/tests/sysdb-tests.c +++ b/src/tests/sysdb-tests.c @@ -3979,7 +3979,7 @@ START_TEST(test_odd_characters) } END_TEST -START_TEST(test_sss_ldb_search) +START_TEST(test_SSS_LDB_SEARCH) { errno_t ret; struct sysdb_test_ctx *test_ctx; @@ -4013,10 +4013,10 @@ START_TEST(test_sss_ldb_search) /* Retrieve */ /* Empty filter */ - ret = sss_ldb_search(test_ctx->sysdb->ldb, test_ctx, &res, group_dn, - LDB_SCOPE_BASE, NULL, NULL); + SSS_LDB_SEARCH(ret, test_ctx->sysdb->ldb, test_ctx, &res, group_dn, + LDB_SCOPE_BASE, NULL, NULL); - fail_unless(ret == EOK, "sss_ldb_search error [%d][%s]", + fail_unless(ret == EOK, "SSS_LDB_SEARCH error [%d][%s]", ret, strerror(ret)); fail_unless(res->count == 1, "Received [%d] responses", @@ -4030,27 +4030,27 @@ START_TEST(test_sss_ldb_search) talloc_zfree(res); /* Non-empty filter */ - ret = sss_ldb_search(test_ctx->sysdb->ldb, test_ctx, &res, group_dn, - LDB_SCOPE_BASE, NULL, "objectClass=group"); + SSS_LDB_SEARCH(ret, test_ctx->sysdb->ldb, test_ctx, &res, group_dn, + LDB_SCOPE_BASE, NULL, "objectClass=group"); - fail_unless(ret == EOK, "sss_ldb_search error [%d][%s]", + fail_unless(ret == EOK, "SSS_LDB_SEARCH error [%d][%s]", ret, strerror(ret)); talloc_zfree(res); /* Filter yeilding no results */ - ret = sss_ldb_search(test_ctx->sysdb->ldb, test_ctx, &res, group_dn, - LDB_SCOPE_BASE, NULL, - "objectClass=nonExistingObjectClass"); + SSS_LDB_SEARCH(ret, test_ctx->sysdb->ldb, test_ctx, &res, group_dn, + LDB_SCOPE_BASE, NULL, + "objectClass=nonExistingObjectClass"); fail_unless(ret == ENOENT, "sss_ldb_search error [%d][%s]", ret, strerror(ret)); talloc_zfree(res); /* Non-existing dn */ - ret = sss_ldb_search(test_ctx->sysdb->ldb, test_ctx, &res, nonexist_dn, - LDB_SCOPE_BASE, NULL, NULL); + SSS_LDB_SEARCH(ret, test_ctx->sysdb->ldb, test_ctx, &res, nonexist_dn, + LDB_SCOPE_BASE, NULL, NULL); - fail_unless(ret == ENOENT, "sss_ldb_search error [%d][%s]", + fail_unless(ret == ENOENT, "SSS_LDB_SEARCH error [%d][%s]", ret, strerror(ret)); talloc_zfree(res); @@ -4626,13 +4626,13 @@ START_TEST (test_sysdb_search_return_ENOENT) talloc_zfree(msgs); talloc_zfree(user_dn); - /* sss_ldb_search */ + /* SSS_LDB_SEARCH */ user_dn = sysdb_user_dn(test_ctx, test_ctx->domain, "nonexisting_user"); fail_if(user_dn == NULL, "sysdb_user_dn failed"); - ret = sss_ldb_search(test_ctx->sysdb->ldb, test_ctx, &res, user_dn, - LDB_SCOPE_BASE, NULL, "objectClass=user"); + SSS_LDB_SEARCH(ret, test_ctx->sysdb->ldb, test_ctx, &res, user_dn, + LDB_SCOPE_BASE, NULL, "objectClass=user"); - fail_unless(ret == ENOENT, "sss_ldb_search failed: %d, %s", + fail_unless(ret == ENOENT, "SSS_LDB_SEARCH failed: %d, %s", ret, strerror(ret)); talloc_zfree(res); @@ -5981,8 +5981,8 @@ Suite *create_sysdb_suite(void) tcase_add_loop_test(tc_memberof, test_sysdb_memberof_check_nested_double_ghosts, MBO_GROUP_BASE , MBO_GROUP_BASE + 10); - /* sss_ldb_search */ - tcase_add_test(tc_sysdb, test_sss_ldb_search); + /* SSS_LDB_SEARCH */ + tcase_add_test(tc_sysdb, test_SSS_LDB_SEARCH); /* This loop counts backwards so the indexing is a little odd */ tcase_add_loop_test(tc_memberof, test_sysdb_memberof_mod_replace_keep, |