]> git.samba.org - metze/samba/wip.git/commitdiff
Make us clean under valgrind --leak-check=full by using talloc_autofree_context(...
authorJeremy Allison <jra@samba.org>
Fri, 7 Nov 2008 04:48:13 +0000 (20:48 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 7 Nov 2008 04:48:13 +0000 (20:48 -0800)
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.

14 files changed:
source3/auth/token_util.c
source3/lib/memcache.c
source3/lib/util.c
source3/lib/util_pw.c
source3/param/loadparm.c
source3/passdb/passdb.c
source3/passdb/pdb_interface.c
source3/passdb/util_unixsids.c
source3/smbd/server.c
source3/smbd/uid.c
source3/utils/net_sam.c
source3/utils/pdbedit.c
source3/utils/smbpasswd.c
source3/web/cgi.c

index e739fdaabe92786cc39ea050ca53f1bb40e96c99..6c00aa0943c1fc8b6f6ceb20f73ab56ca07ac8f4 100644 (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;
index 9c892fedfac5cd68f175675ce4858a80fda37901..d586f707fadd6bd7be2f3055200474c6fc01fb42 100644 (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;
index 820cf376beb79baf2d6552101f4b89474a47d8e1..5007fb72ef8f38a9a912ab21c9fc8548c9e355e5 100644 (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;
 }
index c0d37f1094b7c3c80fb88ac7c1f4f81e31bba67b..e0dbc97f0056093461ac676026662e5560093d42 100644 (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
index fae6cb38dcebaa564182dc797ffd2fa7d5a25766..217957ab37da6343f3e8a05cb0a997905de727a5 100644 (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:
index 60699615f0e0a7ae7db707fea43c1272bf471af6..8367d6a9ad8c9abef109bab882c056bf2c7df8f1 100644 (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;
                        }
 
index fcb38b464b395650143f0a19034f8a521de632b5..6fe105854f17c23bdf16201f80b85ad3120492b8 100644 (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;
        }
 
index 1b674d02a2d1aa9d35bdae0a889cb9a02e611496..ad4e70256dddc23a6786413e89db4cd2fff9977b 100644 (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;
        }
index 7583da65a52e79b5f81b3a84260a23848c6ff26e..fff05a3aac75a6ce38e785725138388f3fa8fabc 100644 (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");
index 8998f6a371bd0adb9e549ef825ea0c216904b7c5..045de6f2d32a8cb850ec05213bc6385d75ff1953 100644 (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);
        }
index ce132131f7332f517618580ad4c38d721d84edc8..e8ebb6020579848885dd9b6cc49e0edfc9ca8f3d 100644 (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");
index fe99b6fc9e581593c4358cb1327c280d23fab882..50cbc43d6de71bcec959b524932168d7eb506c86 100644 (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;
        }
index 600fe52f0d7c4401d9852831e60d6a6679360e36..d2652ad95a55fbf45a3cf7297f52846f51155501 100644 (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);
index ce36bd93101b4823f9975f46304fba8b1e726d2f..49e83717c3d7f0a6c0c2691ca61a9fad3ea49c6a 100644 (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.