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

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

index d6cd2ea3a8474b3de217203fb8975d21049fe016..bb8f222abf69a9d33bd802fbad117948601652fe 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 4590b812c58271c85c820b456f6ef26084f1860e..3c513ea7f40ff7dbdccd840a6bccd48a5fde8852 100644 (file)
@@ -113,7 +113,7 @@ static int do_reseed(bool use_fd, int fd)
         * seriously this will be secret.
         */
 
-       pw = getpwnam_alloc(NULL, "root");
+       pw = getpwnam_alloc(talloc_autofree_context(), "root");
        if (pw && pw->pw_passwd) {
                size_t i;
                unsigned char md4_tmp[16];
index e1426bc811a862529a9ec48f2648980025c9ed1b..74bc804587a6506d1ff37a04579f48909e25f193 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 201d87aeb5cf51a9eddea8cdd0d914ecc5e0737f..4b8b5975287506515db6fef49341e77d9645a036 100644 (file)
@@ -1608,7 +1608,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);
@@ -2541,8 +2541,8 @@ char *myhostname(void)
        static char *ret;
        if (ret == NULL) {
                /* This is cached forever so
-                * use NULL talloc ctx. */
-               ret = get_myname(NULL);
+                * use autofree talloc ctx. */
+               ret = get_myname(talloc_autofree_context());
        }
        return ret;
 }
index 428378505f7a1a1230e7499bb2d6bd0b7ee534b3..4f2a032741339a5107d2330b5f2df98bcfbfd6e2 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 2612b09eef4d9854ea83e30ccf784106ee7c5381..99f25692467474696dd21f78d5e827f9fc96e3cb 100644 (file)
@@ -4858,7 +4858,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(NULL, "template", NULL);
+       Globals.szWinbindNssInfo = str_list_make(talloc_autofree_context(), "template", NULL);
        Globals.bWinbindRefreshTickets = False;
        Globals.bWinbindOfflineLogon = False;
 
@@ -5574,7 +5574,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(NULL, data->value, NULL);
+               data->list = str_list_make(talloc_autofree_context(), data->value, NULL);
        }
 
        return (const char **)data->list;
@@ -6842,7 +6842,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(NULL, pszParmValue, NULL);
+       Globals.szNetbiosAliases = str_list_make(talloc_autofree_context(), pszParmValue, NULL);
        return set_netbios_aliases((const char **)Globals.szNetbiosAliases);
 }
 
@@ -7277,7 +7277,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(
-                               NULL, pszParmValue, NULL);
+                               talloc_autofree_context(), pszParmValue, NULL);
                        break;
 
                case P_STRING:
index 1606c64b1b03685204df21020d583be1d061874f..16d5e0f14219b0ccf121779c282cbfdd9caff027 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 69a483e4fca894e97cf056d3b13093212a3e1bbf..ae36c7d1308ffd7df7bd2f8839cfb67f3702c86d 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 e1d6709073aee32bdca32469e8f776ddd0f9166f..5449c8b9efbd0db730d504ed87e251a5afb065af 100644 (file)
@@ -564,7 +564,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;
        }
@@ -668,7 +668,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 493a249bea88af7a6bb9d4292bfcf8900d3b741b..b18ab5579de87ec752f16605fa90c47cb2b710be 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 070e80cf91df831c331c8dd3459090dded38796f..bcb4ccd813854a52227ea38efb37367705caaad1 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.