mirror of
https://github.com/samba-team/samba.git
synced 2025-01-26 10:04:02 +03:00
r19720: - don't pass a pointer reference to ldb_search_default_callback()
as it's ugly when it free's the callers memory on failure! - only steal the controls on a LDB_REPLY_EXTENDED, LDB_REPLY_DONE and ignore them on LDB_REPLY_ENTRY, LDB_REPLY_REFERRAL as we currently have not way to return them in a ldb_result (we should fix this!) metze (This used to be commit 47da62b15abf48f97ce6fc8dc4627792728349ae)
This commit is contained in:
parent
a39db63030
commit
c046f2e7a3
@ -532,12 +532,13 @@ int ldb_search_default_callback(struct ldb_context *ldb, void *context, struct l
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
res = *((struct ldb_result **)context);
|
||||
res = talloc_get_type(context, struct ldb_result);
|
||||
|
||||
if (!res || !ares) {
|
||||
ldb_set_errstring(ldb, "NULL res or ares in callback");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
||||
switch (ares->type) {
|
||||
case LDB_REPLY_ENTRY:
|
||||
res->msgs = talloc_realloc(res, res->msgs, struct ldb_message *, res->count + 2);
|
||||
@ -566,18 +567,15 @@ int ldb_search_default_callback(struct ldb_context *ldb, void *context, struct l
|
||||
res->refs[n + 1] = NULL;
|
||||
case LDB_REPLY_EXTENDED:
|
||||
case LDB_REPLY_DONE:
|
||||
/* Should do something here to detect if this never
|
||||
* happens */
|
||||
/* TODO: we should really support controls on entries and referrals too! */
|
||||
res->controls = talloc_move(res, &ares->controls);
|
||||
break;
|
||||
}
|
||||
talloc_steal(res, ares->controls);
|
||||
talloc_free(ares);
|
||||
return LDB_SUCCESS;
|
||||
|
||||
error:
|
||||
talloc_free(ares);
|
||||
talloc_free(res);
|
||||
*((struct ldb_result **)context) = NULL;
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
@ -753,16 +751,19 @@ int ldb_search(struct ldb_context *ldb,
|
||||
enum ldb_scope scope,
|
||||
const char *expression,
|
||||
const char * const *attrs,
|
||||
struct ldb_result **res)
|
||||
struct ldb_result **_res)
|
||||
{
|
||||
struct ldb_request *req;
|
||||
int ret;
|
||||
struct ldb_result *res;
|
||||
|
||||
*res = talloc_zero(ldb, struct ldb_result);
|
||||
if (! *res) {
|
||||
*_res = NULL;
|
||||
|
||||
res = talloc_zero(ldb, struct ldb_result);
|
||||
if (!res) {
|
||||
return LDB_ERR_OPERATIONS_ERROR;
|
||||
}
|
||||
|
||||
|
||||
ret = ldb_build_search_req(&req, ldb, ldb,
|
||||
base?base:ldb_get_default_basedn(ldb),
|
||||
scope,
|
||||
@ -786,10 +787,10 @@ int ldb_search(struct ldb_context *ldb,
|
||||
|
||||
done:
|
||||
if (ret != LDB_SUCCESS) {
|
||||
talloc_free(*res);
|
||||
*res = NULL;
|
||||
talloc_free(res);
|
||||
}
|
||||
|
||||
*_res = res;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -336,7 +336,7 @@ done:
|
||||
|
||||
#define _LDB_NSS_ALLOC_CHECK(mem) do { if (!mem) { errno = ENOMEM; return NSS_STATUS_UNAVAIL; } } while(0)
|
||||
|
||||
NSS_STATUS _ldb_nss_group_request(struct ldb_result **res,
|
||||
NSS_STATUS _ldb_nss_group_request(struct ldb_result **_res,
|
||||
struct ldb_dn *group_dn,
|
||||
const char * const *attrs,
|
||||
const char *mattr)
|
||||
@ -346,8 +346,9 @@ NSS_STATUS _ldb_nss_group_request(struct ldb_result **res,
|
||||
struct ldb_asq_control *asqc;
|
||||
struct ldb_request *req;
|
||||
int ret;
|
||||
struct ldb_result *res = *_res;
|
||||
|
||||
ctrls = talloc_array(*res, struct ldb_control *, 2);
|
||||
ctrls = talloc_array(res, struct ldb_control *, 2);
|
||||
_LDB_NSS_ALLOC_CHECK(ctrls);
|
||||
|
||||
ctrl = talloc(ctrls, struct ldb_control);
|
||||
@ -370,7 +371,7 @@ NSS_STATUS _ldb_nss_group_request(struct ldb_result **res,
|
||||
ret = ldb_build_search_req(
|
||||
&req,
|
||||
_ldb_nss_ctx->ldb,
|
||||
*res,
|
||||
res,
|
||||
group_dn,
|
||||
LDB_SCOPE_BASE,
|
||||
"(objectClass=*)",
|
||||
|
Loading…
x
Reference in New Issue
Block a user