1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-29 13:49:30 +03:00

r20150: better memory handling for some functions, make sure we don't

leak memory by using the wrong(long lived)  mem context
This commit is contained in:
Simo Sorce
2006-12-13 16:39:50 +00:00
committed by Gerald (Jerry) Carter
parent c264a0aa4a
commit a28cdd6e74
5 changed files with 39 additions and 19 deletions

View File

@ -81,12 +81,12 @@ failed:
return ret; return ret;
} }
static NTSTATUS idmap_rid_id_to_sid(struct idmap_rid_context *ctx, struct id_map *map) static NTSTATUS idmap_rid_id_to_sid(TALLOC_CTX *memctx, struct idmap_rid_context *ctx, struct id_map *map)
{ {
char *domname, *name; char *domname, *name;
enum lsa_SidType sid_type; enum lsa_SidType sid_type;
if (!ctx || !map) { if (!memctx || !ctx || !map) {
return NT_STATUS_INVALID_PARAMETER; return NT_STATUS_INVALID_PARAMETER;
} }
@ -99,7 +99,7 @@ static NTSTATUS idmap_rid_id_to_sid(struct idmap_rid_context *ctx, struct id_map
sid_compose(map->sid, &ctx->dom_sid, map->xid.id - ctx->low_id + ctx->base_rid); sid_compose(map->sid, &ctx->dom_sid, map->xid.id - ctx->low_id + ctx->base_rid);
if (winbindd_lookup_name_by_sid(ctx, map->sid, &domname, &name, &sid_type)) { if (winbindd_lookup_name_by_sid(memctx, map->sid, &domname, &name, &sid_type)) {
switch (sid_type) { switch (sid_type) {
case SID_NAME_USER: case SID_NAME_USER:
if (map->xid.type != ID_TYPE_UID) { if (map->xid.type != ID_TYPE_UID) {
@ -136,13 +136,13 @@ static NTSTATUS idmap_rid_id_to_sid(struct idmap_rid_context *ctx, struct id_map
Single sid to id lookup function. Single sid to id lookup function.
**********************************/ **********************************/
static NTSTATUS idmap_rid_sid_to_id(struct idmap_rid_context *ctx, struct id_map *map) static NTSTATUS idmap_rid_sid_to_id(TALLOC_CTX *memctx, struct idmap_rid_context *ctx, struct id_map *map)
{ {
char *domname, *name; char *domname, *name;
enum lsa_SidType sid_type; enum lsa_SidType sid_type;
uint32_t rid; uint32_t rid;
if (!ctx || !map) { if (!memctx || !ctx || !map) {
return NT_STATUS_INVALID_PARAMETER; return NT_STATUS_INVALID_PARAMETER;
} }
@ -150,7 +150,7 @@ static NTSTATUS idmap_rid_sid_to_id(struct idmap_rid_context *ctx, struct id_map
map->xid.id = rid - ctx->base_rid + ctx->low_id; map->xid.id = rid - ctx->base_rid + ctx->low_id;
/* check if this is a valid SID and set the type */ /* check if this is a valid SID and set the type */
if (winbindd_lookup_name_by_sid(ctx, map->sid, &domname, &name, &sid_type)) { if (winbindd_lookup_name_by_sid(memctx, map->sid, &domname, &name, &sid_type)) {
switch (sid_type) { switch (sid_type) {
case SID_NAME_USER: case SID_NAME_USER:
map->xid.type = ID_TYPE_UID; map->xid.type = ID_TYPE_UID;
@ -188,17 +188,24 @@ static NTSTATUS idmap_rid_sid_to_id(struct idmap_rid_context *ctx, struct id_map
static NTSTATUS idmap_rid_unixids_to_sids(struct idmap_domain *dom, struct id_map **ids) static NTSTATUS idmap_rid_unixids_to_sids(struct idmap_domain *dom, struct id_map **ids)
{ {
struct idmap_rid_context *ctx; struct idmap_rid_context *ridctx;
TALLOC_CTX *ctx;
NTSTATUS ret; NTSTATUS ret;
int i; int i;
ctx = talloc_get_type(dom->private_data, struct idmap_rid_context); ridctx = talloc_get_type(dom->private_data, struct idmap_rid_context);
ctx = talloc_new(dom);
if ( ! ctx) {
DEBUG(0, ("Out of memory!\n"));
return NT_STATUS_NO_MEMORY;
}
for (i = 0; ids[i]; i++) { for (i = 0; ids[i]; i++) {
/* make sure it is marked as unmapped before resolveing */ /* make sure it is marked as unmapped before resolveing */
ids[i]->mapped = False; ids[i]->mapped = False;
ret = idmap_rid_id_to_sid(ctx, ids[i]); ret = idmap_rid_id_to_sid(ctx, ridctx, ids[i]);
if (( ! NT_STATUS_IS_OK(ret)) && if (( ! NT_STATUS_IS_OK(ret)) &&
( ! NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) { ( ! NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) {
@ -207,6 +214,7 @@ static NTSTATUS idmap_rid_unixids_to_sids(struct idmap_domain *dom, struct id_ma
} }
} }
talloc_free(ctx);
return NT_STATUS_OK; return NT_STATUS_OK;
} }
@ -216,17 +224,24 @@ static NTSTATUS idmap_rid_unixids_to_sids(struct idmap_domain *dom, struct id_ma
static NTSTATUS idmap_rid_sids_to_unixids(struct idmap_domain *dom, struct id_map **ids) static NTSTATUS idmap_rid_sids_to_unixids(struct idmap_domain *dom, struct id_map **ids)
{ {
struct idmap_rid_context *ctx; struct idmap_rid_context *ridctx;
TALLOC_CTX *ctx;
NTSTATUS ret; NTSTATUS ret;
int i; int i;
ctx = talloc_get_type(dom->private_data, struct idmap_rid_context); ridctx = talloc_get_type(dom->private_data, struct idmap_rid_context);
ctx = talloc_new(dom);
if ( ! ctx) {
DEBUG(0, ("Out of memory!\n"));
return NT_STATUS_NO_MEMORY;
}
for (i = 0; ids[i]; i++) { for (i = 0; ids[i]; i++) {
/* make sure it is marked as unmapped before resolveing */ /* make sure it is marked as unmapped before resolveing */
ids[i]->mapped = False; ids[i]->mapped = False;
ret = idmap_rid_sid_to_id(ctx, ids[i]); ret = idmap_rid_sid_to_id(ctx, ridctx, ids[i]);
if (( ! NT_STATUS_IS_OK(ret)) && if (( ! NT_STATUS_IS_OK(ret)) &&
( ! NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) { ( ! NT_STATUS_EQUAL(ret, NT_STATUS_NONE_MAPPED))) {
@ -236,6 +251,7 @@ static NTSTATUS idmap_rid_sids_to_unixids(struct idmap_domain *dom, struct id_ma
} }
} }
talloc_free(ctx);
return NT_STATUS_OK; return NT_STATUS_OK;
} }

View File

@ -738,8 +738,8 @@ enum winbindd_result winbindd_dual_lookupsid(struct winbindd_domain *domain,
{ {
enum lsa_SidType type; enum lsa_SidType type;
DOM_SID sid; DOM_SID sid;
char *name = NULL; char *name;
char *dom_name = NULL; char *dom_name;
/* Ensure null termination */ /* Ensure null termination */
state->request.data.sid[sizeof(state->request.data.sid)-1]='\0'; state->request.data.sid[sizeof(state->request.data.sid)-1]='\0';

View File

@ -442,8 +442,8 @@ static void getgrgid_got_sid(struct winbindd_cli_state *state, DOM_SID group_sid
{ {
struct winbindd_domain *domain; struct winbindd_domain *domain;
enum lsa_SidType name_type; enum lsa_SidType name_type;
char *dom_name = NULL; char *dom_name;
char *group_name = NULL; char *group_name;
size_t gr_mem_len; size_t gr_mem_len;
size_t num_gr_mem; size_t num_gr_mem;
char *gr_mem; char *gr_mem;

View File

@ -718,6 +718,9 @@ BOOL winbindd_lookup_name_by_sid(TALLOC_CTX *mem_ctx,
NTSTATUS result; NTSTATUS result;
struct winbindd_domain *domain; struct winbindd_domain *domain;
*dom_name = NULL;
*name = NULL;
domain = find_lookup_domain_from_sid(sid); domain = find_lookup_domain_from_sid(sid);
if (!domain) { if (!domain) {
@ -736,7 +739,6 @@ BOOL winbindd_lookup_name_by_sid(TALLOC_CTX *mem_ctx,
} }
*type = SID_NAME_UNKNOWN; *type = SID_NAME_UNKNOWN;
*name = talloc_strdup(mem_ctx, name_deadbeef);
return False; return False;
} }

View File

@ -95,8 +95,6 @@ cat >$COMMONCONFFILE<<EOF
log file = $LOGDIR/log.%m log file = $LOGDIR/log.%m
log level = 0 log level = 0
passdb backend = tdbsam
name resolve order = bcast name resolve order = bcast
EOF EOF
@ -108,6 +106,8 @@ cat >$CONFFILE<<EOF
interfaces = $TORTURE_INTERFACES interfaces = $TORTURE_INTERFACES
panic action = $SCRIPTDIR/gdb_backtrace %d %\$(MAKE_TEST_BINARY) panic action = $SCRIPTDIR/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
include = $COMMONCONFFILE include = $COMMONCONFFILE
passdb backend = tdbsam
EOF EOF
cat >$SAMBA4CONFFILE<<EOF cat >$SAMBA4CONFFILE<<EOF
@ -126,6 +126,8 @@ cat >$SERVERCONFFILE<<EOF
panic action = $SCRIPTDIR/gdb_backtrace %d %\$(MAKE_TEST_BINARY) panic action = $SCRIPTDIR/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
include = $COMMONCONFFILE include = $COMMONCONFFILE
passdb backend = tdbsam
; Necessary to add the build farm hacks ; Necessary to add the build farm hacks
add user script = /bin/false add user script = /bin/false
add machine script = /bin/false add machine script = /bin/false