Fixed memleaks and segfaults
authorMatch Grun <match@dimensional.com>
Sat, 26 Apr 2003 04:56:44 +0000 (04:56 +0000)
committerMatch Grun <match@dimensional.com>
Sat, 26 Apr 2003 04:56:44 +0000 (04:56 +0000)
ChangeLog.claws
configure.ac
src/addrbook.c
src/addrindex.c
src/ldapquery.c
src/ldapquery.h
src/ldapserver.c
src/ldapserver.h

index 9dabaa9..77a9b29 100644 (file)
@@ -1,3 +1,14 @@
+2003-04-25 [match]     0.8.11claws113
+
+       * src/addrindex.c
+       * src/addrbook.c
+       * src/ldapquery.[ch]
+       * src/ldapctrl.[ch]
+               fix memleak.
+       * src/ldapserver.[ch]
+               fix memleak. fix segfault.
+               plug a Claws memleak
+
 2003-04-25 [alfons]    0.8.11claws112
 
        * src/folder.c
index 5bfda6b..7f91cb9 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=8
 MICRO_VERSION=11
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=claws112
+EXTRA_VERSION=claws113
 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
 
 dnl set $target
index e81625c..909568d 100644 (file)
@@ -511,17 +511,22 @@ static void addrbook_parse_member(AddressBookFile *book, XMLFile *file,
 {
        GList *attr;
        gchar *name, *value;
-       gchar *pid = NULL, *eid = NULL;
+       gchar *eid = NULL;
+       /* gchar *pid = NULL; */
        ItemEMail *email = NULL;
 
        attr = xml_get_current_tag_attr(file);
        while (attr) {
                name = ((XMLAttr *)attr->data)->name;
                value = ((XMLAttr *)attr->data)->value;
+               /*
                if (strcmp(name, AB_ATTAG_PID) == 0)
                        pid = g_strdup(value);
                else if (strcmp(name, AB_ATTAG_EID) == 0)
                        eid = g_strdup(value);
+               */
+               if( strcmp( name, AB_ATTAG_EID ) == 0 )
+                       eid = g_strdup( value );
                attr = g_list_next(attr);
        }
        /* email = addrcache_get_email( book->addressCache, pid, eid ); */
index c706968..785a44c 100644 (file)
@@ -1370,7 +1370,7 @@ static AddressDataSource *addrindex_parse_ldap( XMLFile *file ) {
                attr = g_list_next( attr );
        }
 
-       server = ldapsvr_create();
+       server = ldapsvr_create_noctl();
        ldapsvr_set_name( server, serverName );
        ldapsvr_set_search_flag( server, bSearch );
        g_free( serverName );
@@ -2591,7 +2591,7 @@ static void addrindex_search_ldap( LdapServer *server, const gint queryID ) {
        gchar *name;
 
        if( ! server->searchFlag ) return;
-       printf( "Searching ::%s::\n", ldapsvr_get_name( server ) );
+       /* printf( "Searching ::%s::\n", ldapsvr_get_name( server ) ); */
 
        /* Retire any aged queries */
        ldapsvr_retire_query( server );
index 53bdb17..e157dfc 100644 (file)
@@ -299,20 +299,6 @@ gboolean ldapqry_get_aged_flag( LdapQuery *qry ) {
        return qry->agedFlag;
 }
 
-/**
- * Release the thread associated with the query.
- * \param qry Query object to process.
- */
-void ldapqry_release_thread( LdapQuery *qry ) {
-       g_return_if_fail( qry != NULL );
-       printf( "ldapqry_release_thread...\n" );
-       if( qry->thread != NULL ) {
-               g_free( qry->thread );
-               printf( "\t===========>done\n" );
-       }
-       qry->thread = NULL;
-}
-
 /**
  * Release the LDAP control data associated with the query.
  * \param qry Query object to process.
@@ -354,7 +340,8 @@ void ldapqry_clear( LdapQuery *qry ) {
 }
 
 /**
- * Free up LDAP query object by releasing internal memory.
+ * Free up LDAP query object by releasing internal memory. Note that
+ * the thread object will be freed by the OS.
  * \param qry Query object to process.
  */
 void ldapqry_free( LdapQuery *qry ) {
@@ -957,7 +944,7 @@ gint ldapqry_read_data_th( LdapQuery *qry ) {
  * to prevent joining threads.
  * \param qry Query object to process.
  */
-void ldapqry_join_thread( LdapQuery *qry ) {
+void ldapqry_join_threadX( LdapQuery *qry ) {
        g_return_if_fail( qry != NULL );
 
        /* Wait for thread */
@@ -968,7 +955,7 @@ void ldapqry_join_thread( LdapQuery *qry ) {
 
 /**
  * Cleanup LDAP thread data. This function will be called when each thread
- * exits.
+ * exits. Note that the thread object will be freed by the kernel.
  * \param ptr Pointer to object being destroyed (a query object in this case).
  */
 static void ldapqry_destroyer( void * ptr ) {
@@ -984,10 +971,6 @@ static void ldapqry_destroyer( void * ptr ) {
                ldapctl_free( qry->control );
        }
        qry->control = NULL;
-
-       if( qry->thread ) {
-               g_free( qry->thread );
-       }
        qry->thread = NULL;
        ldapqry_set_busy_flag( qry, FALSE );
        /*
index 34bb712..0ae878b 100644 (file)
@@ -94,7 +94,6 @@ void ldapqry_set_callback_start       ( LdapQuery *qry, void *func );
 void ldapqry_set_callback_entry        ( LdapQuery *qry, void *func );
 void ldapqry_set_callback_end  ( LdapQuery *qry, void *func );
 void ldapqry_clear             ( LdapQuery *qry );
-void ldapqry_release_thread    ( LdapQuery *qry );
 void ldapqry_free              ( LdapQuery *qry );
 void ldapqry_print             ( const LdapQuery *qry, FILE *stream );
 void ldapqry_set_stop_flag     ( LdapQuery *qry, const gboolean value );
index b091e53..33915ac 100644 (file)
 #include "adbookbase.h"
 
 /**
- * Create new LDAP server interface object.
+ * Create new LDAP server interface object with no control object.
  * \return Initialized LDAP server object.
  */
-LdapServer *ldapsvr_create() {
+LdapServer *ldapsvr_create_noctl( void ) {
        LdapServer *server;
 
        server = g_new0( LdapServer, 1 );
        server->type = ADBOOKTYPE_LDAP;
        server->addressCache = addrcache_create();
        server->retVal = MGU_SUCCESS;
-       server->control = ldapctl_create();
+       server->control = NULL;
        server->listQuery = NULL;
        server->searchFlag = FALSE;
        return server;
 }
 
+/**
+ * Create new LDAP server interface object.
+ * \return Initialized LDAP server object.
+ */
+LdapServer *ldapsvr_create( void ) {
+       LdapServer *server;
+
+       server = ldapsvr_create();
+       server->control = ldapctl_create();
+       return server;
+}
+
 /**
  * Return name of server.
  * \param  server Server object.
@@ -204,6 +216,38 @@ static void ldapsvr_release_control( LdapServer *server ) {
        server->control = NULL;
 }
 
+/**
+ * Free all queries.
+ * \param server Server object.
+ */
+void ldapsvr_free_all_query( LdapServer *server ) {
+       GList *node;    
+       g_return_if_fail( server != NULL );
+
+       node = server->listQuery;
+       while( node ) {
+               LdapQuery *qry = node->data;
+               ldapqry_free( qry );
+               node->data = NULL;
+               node = g_list_next( node );
+       }
+       g_list_free( server->listQuery );
+       server->listQuery = NULL;
+}
+
+/**
+ * Add query to server.
+ * \param server Server object.
+ * \param qry    Query object.
+ */
+void ldapsvr_add_query( LdapServer *server, LdapQuery *qry ) {
+       g_return_if_fail( server != NULL );
+       g_return_if_fail( qry != NULL );
+
+       server->listQuery = g_list_append( server->listQuery, qry );
+       qry->server = server;
+}
+
 /**
  * Free up LDAP server interface object by releasing internal memory.
  * \param server Server object.
@@ -223,6 +267,9 @@ void ldapsvr_free( LdapServer *server ) {
        ldapctl_free( server->control );
        server->control = NULL;
 
+       /* Free all queries */
+       ldapsvr_free_all_query( server );
+
        /* Clear pointers */
        server->type = ADBOOKTYPE_NONE;
        server->addressCache = NULL;
@@ -269,38 +316,6 @@ void ldapsvr_print_data( LdapServer *server, FILE *stream ) {
        }
 }
 
-/**
- * Add query to server.
- * \param server Server object.
- * \param qry    Query object.
- */
-void ldapsvr_add_query( LdapServer *server, LdapQuery *qry ) {
-       g_return_if_fail( server != NULL );
-       g_return_if_fail( qry != NULL );
-
-       server->listQuery = g_list_append( server->listQuery, qry );
-       qry->server = server;
-}
-
-/**
- * Free all queries.
- * \param server Server object.
- */
-void ldapsvr_free_all_query( LdapServer *server ) {
-       GList *node;    
-       g_return_if_fail( server != NULL );
-
-       node = server->listQuery;
-       while( node ) {
-               LdapQuery *qry = node->data;
-               ldapqry_free( qry );
-               node->data = NULL;
-               node = g_list_next( node );
-       }
-       g_list_free( server->listQuery );
-       server->listQuery = NULL;
-}
-
 /**
  * Return link list of persons.
  * \param server Server object.
@@ -341,14 +356,16 @@ void ldapsvr_execute_query( LdapServer *server, LdapQuery *qry ) {
        ldapqry_initialize();
 
        /* Perform query */     
-       printf( "ldapsvr_execute_query::reading with thread...\n" );
+       /* printf( "ldapsvr_execute_query::reading with thread...\n" ); */
        if( ldapqry_check_search( qry ) ) {
                ldapqry_read_data_th( qry );
+               /*
                if( qry->retVal == LDAPRC_SUCCESS ) {
                        printf( "ldapsvr_execute_query::SUCCESS with thread...\n" );
                }
+               */
        }
-       printf( "ldapsvr_execute_query... terminated\n" );
+       /* printf( "ldapsvr_execute_query... terminated\n" ); */
 }
 
 /**
index e18e4d1..aa72775 100644 (file)
@@ -52,10 +52,12 @@ struct _LdapServer {
 };
 
 /* Function prototypes */
+LdapServer *ldapsvr_create_noctl( void );
 LdapServer *ldapsvr_create     ( void );
 void ldapsvr_set_name          ( LdapServer *server, const gchar *value );
 void ldapsvr_set_accessed      ( LdapServer *server, const gboolean value );
 void ldapsvr_force_refresh     ( LdapServer *server );
+void ldapsvr_free_all_query    ( LdapServer *server );
 void ldapsvr_free              ( LdapServer *server );
 gint ldapsvr_get_status                ( LdapServer *server );
 gboolean ldapsvr_get_accessed  ( LdapServer *server );