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:
committed by
Gerald (Jerry) Carter
parent
c264a0aa4a
commit
a28cdd6e74
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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';
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user