bug 1195: add flag to ADS_STRUCT so we know who owns the main structure's memory...
authorGerald Carter <jerry@samba.org>
Mon, 22 Mar 2004 22:49:40 +0000 (22:49 +0000)
committerGerald Carter <jerry@samba.org>
Mon, 22 Mar 2004 22:49:40 +0000 (22:49 +0000)
source/include/ads.h
source/libads/ads_struct.c
source/nsswitch/winbindd_ads.c

index 65a5ade556d2411d83271cdb92b99af9bb09d16a..5ae577efe7521da3e1d60451daf31d0c8acb9648 100644 (file)
@@ -10,6 +10,8 @@ typedef struct {
        time_t last_attempt; /* last attempt to reconnect */
        int ldap_port;
        
+       int is_mine;    /* do I own this structure's memory? */
+       
        /* info needed to find the server */
        struct {
                char *realm;
index 9774968e1214998f2294844a17a514b856b12dc9..92f37093f460d1cbcf6df49ab077e1c7e34bc8e6 100644 (file)
@@ -102,13 +102,10 @@ ADS_STRUCT *ads_init(const char *realm,
                ads->server.foreign = 1;
        }
 
-       return ads;
-}
+       /* the caller will own the memory by default */
+       ads->is_mine = 1;
 
-/* a simpler ads_init() interface using all defaults */
-ADS_STRUCT *ads_init_simple(void)
-{
-       return ads_init(NULL, NULL, NULL);
+       return ads;
 }
 
 /*
@@ -117,6 +114,9 @@ ADS_STRUCT *ads_init_simple(void)
 void ads_destroy(ADS_STRUCT **ads)
 {
        if (ads && *ads) {
+               BOOL is_mine;
+
+               is_mine = (*ads)->is_mine;
 #if HAVE_LDAP
                if ((*ads)->ld) ldap_unbind((*ads)->ld);
 #endif
@@ -133,8 +133,11 @@ void ads_destroy(ADS_STRUCT **ads)
                SAFE_FREE((*ads)->config.realm);
                SAFE_FREE((*ads)->config.bind_path);
                SAFE_FREE((*ads)->config.ldap_server_name);
-
+               
+               
                ZERO_STRUCTP(*ads);
-               SAFE_FREE(*ads);
+
+               if ( is_mine )
+                       SAFE_FREE(*ads);
        }
 }
index e6b857f4061520c304cfcd6372a968766112f439..8bec04f1f1499f0ca8bf90b625e4841422c99ccd 100644 (file)
@@ -5,6 +5,7 @@
 
    Copyright (C) Andrew Tridgell 2001
    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2003
+   Copyright (C) Gerald (Jerry) Carter 2004
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -39,7 +40,21 @@ static ADS_STRUCT *ads_cached_connection(struct winbindd_domain *domain)
        ADS_STATUS status;
 
        if (domain->private) {
-               return (ADS_STRUCT *)domain->private;
+               ads = (ADS_STRUCT *)domain->private;
+
+               /* check for a valid structure */
+               if ( ads->config.realm ) {
+                       return ads;
+               }
+               else {
+                       /* we own this ADS_STRUCT so make sure it goes away */
+                       ads->is_mine = True;
+                       ads_destroy( &ads );
+                       
+                       /* we should always be NULL here */
+                       SMB_ASSERT( ads == NULL );
+               }
+               
        }
 
        /* we don't want this to affect the users ccache */
@@ -79,6 +94,12 @@ static ADS_STRUCT *ads_cached_connection(struct winbindd_domain *domain)
                return NULL;
        }
 
+       /* set the flag that says we don't own the memory even 
+          though we do so that ads_destroy() won't destroy the 
+          structure we pass back by reference */
+
+       ads->is_mine = False;
+
        domain->private = (void *)ads;
        return ads;
 }