1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

Make us clean under valgrind --leak-check=full by using talloc_autofree_context() instead of NULL.

Remove the code in memcache that does a TALLOC_FREE on stored pointers. That's a disaster waiting
to happen. If you're storing talloc'ed pointers, you can't know their lifecycle and they should
be deleted when their parent context is deleted, so freeing them at some arbitrary point later
will be a double-free.
Jeremy.
This commit is contained in:
Jeremy Allison 2008-11-06 20:48:13 -08:00
parent 7ae6253455
commit 8962be69c7
14 changed files with 24 additions and 50 deletions

View File

@ -102,7 +102,7 @@ NT_USER_TOKEN *get_root_nt_token( void )
uid_to_sid(&u_sid, pw->pw_uid);
gid_to_sid(&g_sid, pw->pw_gid);
token = create_local_nt_token(NULL, &u_sid, False,
token = create_local_nt_token(talloc_autofree_context(), &u_sid, False,
1, &global_sid_Builtin_Administrators);
token->privileges = se_disk_operators;

View File

@ -40,37 +40,11 @@ struct memcache {
static void memcache_element_parse(struct memcache_element *e,
DATA_BLOB *key, DATA_BLOB *value);
static bool memcache_is_talloc(enum memcache_number n)
{
bool result;
switch (n) {
case GETPWNAM_CACHE:
case PDB_GETPWSID_CACHE:
case SINGLETON_CACHE_TALLOC:
result = true;
break;
default:
result = false;
break;
}
return result;
}
static int memcache_destructor(struct memcache *cache) {
struct memcache_element *e, *next;
for (e = cache->mru; e != NULL; e = next) {
next = e->next;
if (memcache_is_talloc((enum memcache_number)e->n)
&& (e->valuelength == sizeof(void *))) {
DATA_BLOB key, value;
void *ptr;
memcache_element_parse(e, &key, &value);
memcpy(&ptr, value.data, sizeof(ptr));
TALLOC_FREE(ptr);
}
SAFE_FREE(e);
}
return 0;

View File

@ -1497,7 +1497,7 @@ uid_t nametouid(const char *name)
char *p;
uid_t u;
pass = getpwnam_alloc(NULL, name);
pass = getpwnam_alloc(talloc_autofree_context(), name);
if (pass) {
u = pass->pw_uid;
TALLOC_FREE(pass);
@ -2255,8 +2255,8 @@ char *myhostname(void)
static char *ret;
if (ret == NULL) {
/* This is cached forever so
* use NULL talloc ctx. */
ret = talloc_get_myname(NULL);
* use talloc_autofree_context() ctx. */
ret = talloc_get_myname(talloc_autofree_context());
}
return ret;
}

View File

@ -57,7 +57,7 @@ struct passwd *getpwnam_alloc(TALLOC_CTX *mem_ctx, const char *name)
return NULL;
}
cached = tcopy_passwd(NULL, temp);
cached = tcopy_passwd(talloc_autofree_context(), temp);
if (cached == NULL) {
/*
* Just don't add this into the cache, ignore the failure

View File

@ -4899,7 +4899,7 @@ static void init_globals(bool first_time_only)
Globals.bWinbindTrustedDomainsOnly = False;
Globals.bWinbindNestedGroups = True;
Globals.winbind_expand_groups = 1;
Globals.szWinbindNssInfo = str_list_make_v3(NULL, "template", NULL);
Globals.szWinbindNssInfo = str_list_make_v3(talloc_autofree_context(), "template", NULL);
Globals.bWinbindRefreshTickets = False;
Globals.bWinbindOfflineLogon = False;
@ -5615,7 +5615,7 @@ const char **lp_parm_string_list(int snum, const char *type, const char *option,
return (const char **)def;
if (data->list==NULL) {
data->list = str_list_make_v3(NULL, data->value, NULL);
data->list = str_list_make_v3(talloc_autofree_context(), data->value, NULL);
}
return (const char **)data->list;
@ -6859,7 +6859,7 @@ static bool handle_netbios_scope(int snum, const char *pszParmValue, char **ptr)
static bool handle_netbios_aliases(int snum, const char *pszParmValue, char **ptr)
{
TALLOC_FREE(Globals.szNetbiosAliases);
Globals.szNetbiosAliases = str_list_make_v3(NULL, pszParmValue, NULL);
Globals.szNetbiosAliases = str_list_make_v3(talloc_autofree_context(), pszParmValue, NULL);
return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
}
@ -7262,7 +7262,7 @@ bool lp_do_parameter(int snum, const char *pszParmName, const char *pszParmValue
case P_LIST:
TALLOC_FREE(*((char ***)parm_ptr));
*(char ***)parm_ptr = str_list_make_v3(
NULL, pszParmValue, NULL);
talloc_autofree_context(), pszParmValue, NULL);
break;
case P_STRING:

View File

@ -665,7 +665,7 @@ NTSTATUS local_password_change(const char *user_name,
DEBUGLEVEL = 1;
}
if ( !(pwd = getpwnam_alloc( NULL, user_name)) ) {
if ( !(pwd = getpwnam_alloc(talloc_autofree_context(), user_name)) ) {
return NT_STATUS_NO_SUCH_USER;
}

View File

@ -242,7 +242,7 @@ bool guest_user_info( struct samu *user )
NTSTATUS result;
const char *guestname = lp_guestaccount();
if ( !(pwd = getpwnam_alloc( NULL, guestname ) ) ) {
if ( !(pwd = getpwnam_alloc(talloc_autofree_context(), guestname ) ) ) {
DEBUG(0,("guest_user_info: Unable to locate guest account [%s]!\n",
guestname));
return False;
@ -2016,7 +2016,7 @@ NTSTATUS make_pdb_method( struct pdb_methods **methods )
{
/* allocate memory for the structure as its own talloc CTX */
if ( !(*methods = TALLOC_ZERO_P(NULL, struct pdb_methods) ) ) {
if ( !(*methods = TALLOC_ZERO_P(talloc_autofree_context(), struct pdb_methods) ) ) {
return NT_STATUS_NO_MEMORY;
}

View File

@ -56,7 +56,7 @@ bool lookup_unix_user_name(const char *name, DOM_SID *sid)
{
struct passwd *pwd;
pwd = getpwnam_alloc(NULL, name);
pwd = getpwnam_alloc(talloc_autofree_context(), name);
if (pwd == NULL) {
return False;
}

View File

@ -80,7 +80,7 @@ struct event_context *smbd_event_context(void)
{
static struct event_context *ctx;
if (!ctx && !(ctx = event_context_init(NULL))) {
if (!ctx && !(ctx = event_context_init(talloc_autofree_context()))) {
smb_panic("Could not init smbd event context");
}
return ctx;
@ -91,7 +91,7 @@ struct messaging_context *smbd_messaging_context(void)
static struct messaging_context *ctx;
if (ctx == NULL) {
ctx = messaging_init(NULL, server_id_self(),
ctx = messaging_init(talloc_autofree_context(), server_id_self(),
smbd_event_context());
}
if (ctx == NULL) {
@ -105,7 +105,7 @@ struct memcache *smbd_memcache(void)
static struct memcache *cache;
if (!cache
&& !(cache = memcache_init(NULL,
&& !(cache = memcache_init(talloc_autofree_context(),
lp_max_stat_cache_size()*1024))) {
smb_panic("Could not init smbd memcache");

View File

@ -32,7 +32,7 @@ bool change_to_guest(void)
if (!pass) {
/* Don't need to free() this as its stored in a static */
pass = getpwnam_alloc(NULL, lp_guestaccount());
pass = getpwnam_alloc(talloc_autofree_context(), lp_guestaccount());
if (!pass)
return(False);
}

View File

@ -1735,7 +1735,7 @@ doma_done:
d_printf("Checking Guest's group.\n");
pwd = getpwnam_alloc(NULL, lp_guestaccount());
pwd = getpwnam_alloc(talloc_autofree_context(), lp_guestaccount());
if (!pwd) {
d_fprintf(stderr, "Failed to find just created Guest account!\n"
" Is nss properly configured?!\n");

View File

@ -571,7 +571,7 @@ static int new_user (struct pdb_methods *in, const char *username,
get_global_sam_sid();
if ( !(pwd = getpwnam_alloc( NULL, username )) ) {
if ( !(pwd = getpwnam_alloc(talloc_autofree_context(), username )) ) {
DEBUG(0,("Cannot locate Unix account for %s\n", username));
return -1;
}
@ -675,7 +675,7 @@ static int new_machine (struct pdb_methods *in, const char *machine_in)
fstrcpy(machineaccount, machinename);
fstrcat(machineaccount, "$");
if ( !(pwd = getpwnam_alloc( NULL, machineaccount )) ) {
if ( !(pwd = getpwnam_alloc(talloc_autofree_context(), machineaccount )) ) {
DEBUG(0,("Cannot locate Unix account for %s\n", machineaccount));
return -1;
}

View File

@ -337,7 +337,7 @@ static int process_root(int local_flags)
load_interfaces();
}
if (!user_name[0] && (pwd = getpwuid_alloc(NULL, geteuid()))) {
if (!user_name[0] && (pwd = getpwuid_alloc(talloc_autofree_context(), geteuid()))) {
fstrcpy(user_name, pwd->pw_name);
TALLOC_FREE(pwd);
}
@ -498,7 +498,7 @@ static int process_nonroot(int local_flags)
}
if (!user_name[0]) {
pwd = getpwuid_alloc(NULL, getuid());
pwd = getpwuid_alloc(talloc_autofree_context(), getuid());
if (pwd) {
fstrcpy(user_name,pwd->pw_name);
TALLOC_FREE(pwd);

View File

@ -314,7 +314,7 @@ static void cgi_web_auth(void)
exit(0);
}
pwd = getpwnam_alloc(NULL, user);
pwd = getpwnam_alloc(talloc_autofree_context(), user);
if (!pwd) {
printf("%sCannot find user %s<br>%s\n", head, user, tail);
exit(0);
@ -367,7 +367,7 @@ static bool cgi_handle_authorization(char *line)
* Try and get the user from the UNIX password file.
*/
pass = getpwnam_alloc(NULL, user);
pass = getpwnam_alloc(talloc_autofree_context(), user);
/*
* Validate the password they have given.