From d02be8587d411b75e8b72c5830528641007cc15a Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: Wed, 12 Mar 2014 14:38:50 -0400 Subject: [PATCH 182/225] Ticket 47740 - Fix coverity issues - part 3 12504 - resource leak - /ldap/servers/slapd/back-ldbm/import-threads.c 12499 - resource leak - /ldap/servers/slapd/passwd_extop.c 12497 - resource leak - /ldap/servers/slapd/mapping_tree.c 12496 - resource leak - /ldap/servers/slapd/mapping_tree.c 12495 - resource leak - /ldap/servers/plugins/replication/legacy_consumer.c 12493 - resource leak - /ldap/servers/slapd/tools/rsearch/sdattable.c 12492 - resource leak - /ldap/servers/slapd/tools/pwenc.c 12491 - resource leak - /ldap/servers/slapd/tools/mmldif.c https://fedorahosted.org/389/ticket/47740 Reviewed by: rmeggins(Thanks!) (cherry picked from commit ff78177452f1ac3da6039640815cc2eaf55b0b40) (cherry picked from commit 2b9788b7d282b055b6f1945eb3f3b5c784d779fc) (cherry picked from commit fd8668bcf47935a4fb90d782badf6c8bf07f6c94) --- ldap/servers/plugins/replication/legacy_consumer.c | 10 ++-- ldap/servers/slapd/back-ldbm/import-threads.c | 1 + ldap/servers/slapd/mapping_tree.c | 16 ++++++ ldap/servers/slapd/passwd_extop.c | 4 +- ldap/servers/slapd/tools/mmldif.c | 2 + ldap/servers/slapd/tools/pwenc.c | 4 +- ldap/servers/slapd/tools/rsearch/sdattable.c | 58 ++++++++++++++-------- 7 files changed, 65 insertions(+), 30 deletions(-) diff --git a/ldap/servers/plugins/replication/legacy_consumer.c b/ldap/servers/plugins/replication/legacy_consumer.c index 2440ce7..aa5a9b5 100644 --- a/ldap/servers/plugins/replication/legacy_consumer.c +++ b/ldap/servers/plugins/replication/legacy_consumer.c @@ -371,11 +371,12 @@ legacy_consumer_config_modify (Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi { if (mod_type == LDAP_MOD_REPLACE) { + slapi_ch_free_string(&legacy_consumer_replicationpw); legacy_consumer_replicationpw = config_copy_strval(config_attr_value); } else if (mod_type == LDAP_MOD_DELETE) { - legacy_consumer_replicationpw = NULL; + slapi_ch_free_string(&legacy_consumer_replicationpw); } else if (mod_type == LDAP_MOD_ADD) { @@ -387,6 +388,7 @@ legacy_consumer_config_modify (Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi } else { + slapi_ch_free_string(&legacy_consumer_replicationpw); legacy_consumer_replicationpw = config_copy_strval(config_attr_value); } } @@ -419,11 +421,8 @@ legacy_consumer_config_delete (Slapi_PBlock *pb, Slapi_Entry* e, Slapi_Entry* en slapi_rwlock_wrlock (legacy_consumer_config_lock); if (legacy_consumer_replicationdn) slapi_sdn_free (&legacy_consumer_replicationdn); - if (legacy_consumer_replicationpw) - slapi_ch_free ((void**)&legacy_consumer_replicationpw); - + slapi_ch_free_string(&legacy_consumer_replicationpw); legacy_consumer_replicationdn = NULL; - legacy_consumer_replicationpw = NULL; slapi_rwlock_unlock (legacy_consumer_config_lock); *returncode = LDAP_SUCCESS; @@ -446,6 +445,7 @@ legacy_consumer_extract_config(Slapi_Entry* entry, char *returntext) legacy_consumer_replicationdn = slapi_sdn_new_dn_passin (arg); arg= slapi_entry_attr_get_charptr(entry,CONFIG_LEGACY_REPLICATIONPW_ATTRIBUTE); + slapi_ch_free_string(&legacy_consumer_replicationpw); legacy_consumer_replicationpw = arg; slapi_rwlock_unlock (legacy_consumer_config_lock); diff --git a/ldap/servers/slapd/back-ldbm/import-threads.c b/ldap/servers/slapd/back-ldbm/import-threads.c index c7d3444..d30936e 100644 --- a/ldap/servers/slapd/back-ldbm/import-threads.c +++ b/ldap/servers/slapd/back-ldbm/import-threads.c @@ -2256,6 +2256,7 @@ import_foreman(void *param) "of the duplicated entry %s; " "Entry ID: %d", orig_dn, fi->entry->ep_id); + slapi_ch_free_string(&orig_dn); goto cont; } new_entrydn = slapi_attr_new(); diff --git a/ldap/servers/slapd/mapping_tree.c b/ldap/servers/slapd/mapping_tree.c index 19c5708..12d9205 100644 --- a/ldap/servers/slapd/mapping_tree.c +++ b/ldap/servers/slapd/mapping_tree.c @@ -1110,6 +1110,8 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor "Error: could not find parent for %s\n", slapi_entry_get_dn(entryAfter), 0, 0); slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } @@ -1148,6 +1150,8 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor { free_mapping_tree_node_arrays(&backends, &be_names, &be_states, &be_list_count); slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } @@ -1161,6 +1165,8 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor mtn_unlock(); free_mapping_tree_node_arrays(&backends, &be_names, &be_states, &be_list_count); slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); return SLAPI_DSE_CALLBACK_ERROR; } @@ -1189,12 +1195,16 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE, "must use replace operation to change state\n"); *returncode = LDAP_UNWILLING_TO_PERFORM; slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); return SLAPI_DSE_CALLBACK_ERROR; } if ((mods[i]->mod_bvalues == NULL) || (mods[i]->mod_bvalues[0] == NULL)) { slapi_sdn_free(&subtree); *returncode = LDAP_OPERATIONS_ERROR; + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); return SLAPI_DSE_CALLBACK_ERROR; } @@ -1208,6 +1218,8 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor { PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE, "need to set nsslapd-backend before moving to backend state\n"); slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } @@ -1220,6 +1232,8 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor { PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE, "need to set nsslapd-referral before moving to referral state\n"); slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } @@ -1258,6 +1272,8 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor *returncode = LDAP_UNWILLING_TO_PERFORM; mtn_unlock(); slapi_sdn_free(&subtree); + slapi_ch_free_string(&plugin_fct); + slapi_ch_free_string(&plugin_lib); return SLAPI_DSE_CALLBACK_ERROR; } diff --git a/ldap/servers/slapd/passwd_extop.c b/ldap/servers/slapd/passwd_extop.c index 4aebee3..9ad470f 100644 --- a/ldap/servers/slapd/passwd_extop.c +++ b/ldap/servers/slapd/passwd_extop.c @@ -905,7 +905,6 @@ static char *passwd_name_list[] = { int passwd_modify_init( Slapi_PBlock *pb ) { char **argv; - char *oid; /* Get the arguments appended to the plugin extendedop directive. The first argument * (after the standard arguments for the directive) should contain the OID of the @@ -924,9 +923,8 @@ int passwd_modify_init( Slapi_PBlock *pb ) "OID is missing or is not %s\n", EXTOP_PASSWD_OID ); return( -1 ); } else { - oid = slapi_ch_strdup( argv[0] ); slapi_log_error( SLAPI_LOG_PLUGIN, "passwd_modify_init", - "Registering plug-in for Password Modify extended op %s.\n", oid ); + "Registering plug-in for Password Modify extended op %s.\n", argv[0] /* oid */); } /* Register the plug-in function as an extended operation diff --git a/ldap/servers/slapd/tools/mmldif.c b/ldap/servers/slapd/tools/mmldif.c index 1f01976..4213e65 100644 --- a/ldap/servers/slapd/tools/mmldif.c +++ b/ldap/servers/slapd/tools/mmldif.c @@ -659,6 +659,7 @@ int mm_init(int argc, char * argv[]) slapd_ldap_debug = 65535; break; case 'o': + if(ofn) free (ofn); ofn = strdup(optarg); break; case 'h': @@ -677,6 +678,7 @@ int mm_init(int argc, char * argv[]) ofp = fopen(ofn, "w"); if (ofp == NULL) { perror(ofn); + free(ofn); return -1; } free(ofn); diff --git a/ldap/servers/slapd/tools/pwenc.c b/ldap/servers/slapd/tools/pwenc.c index 221398c..34cfe1b 100644 --- a/ldap/servers/slapd/tools/pwenc.c +++ b/ldap/servers/slapd/tools/pwenc.c @@ -140,8 +140,10 @@ init_config(char *configdir) abs_configdir = rel2abspath( configdir ); if ( config_set_configdir( "configdir (-D)", abs_configdir, - errorbuf, 1) != LDAP_SUCCESS ) { + errorbuf, 1) != LDAP_SUCCESS ) + { fprintf( stderr, "%s\n", errorbuf ); + slapi_ch_free_string(&abs_configdir); return( NULL ); } slapi_ch_free_string(&abs_configdir); diff --git a/ldap/servers/slapd/tools/rsearch/sdattable.c b/ldap/servers/slapd/tools/rsearch/sdattable.c index c0274d0..18417a1 100644 --- a/ldap/servers/slapd/tools/rsearch/sdattable.c +++ b/ldap/servers/slapd/tools/rsearch/sdattable.c @@ -141,27 +141,43 @@ int sdt_load(SDatTable *sdt, const char *filename) if (!fd) return 0; while (PR_Available(fd) > 0) { - int rval; - char temp[256]; - char *dn = NULL; - char *uid = NULL; - while (!(rval = PR_GetLine(fd, temp, 256))) { - char *p; - if (!strncasecmp(temp, "dn:", 3)) { - for (p = temp + 4; *p == ' ' || *p == '\t'; p++) ; - dn = strdup(p); - if (!dn) break; - } else if (!strncasecmp(temp, "uid:", 4)) { - for (p = temp + 5; *p == ' ' || *p == '\t'; p++) ; - uid = strdup(p); - if (!uid) break; - } - if (uid) { /* dn should come earlier than uid */ - if (!sdt_push(sdt, dn, uid)) goto out; - break; - } - } - if (rval) break; /* PR_GetLine failed */ + int rval; + int pushed = 0; + char temp[256]; + char *dn = NULL; + char *uid = NULL; + while (!(rval = PR_GetLine(fd, temp, 256))) { + char *p; + if (!strncasecmp(temp, "dn:", 3)) { + for (p = temp + 4; *p == ' ' || *p == '\t'; p++) ; + dn = strdup(p); + if (!dn) break; + } else if (!strncasecmp(temp, "uid:", 4)) { + for (p = temp + 5; *p == ' ' || *p == '\t'; p++) ; + uid = strdup(p); + if (!uid) break; + } + if (uid) { + /* dn should come earlier than uid - so both dn and uid must be set. */ + if (!sdt_push(sdt, dn, uid)){ + /* failure, free the dn and uid */ + free(dn); + free(uid); + goto out; + } + pushed = 1; + break; + } + } + if(!pushed){ + /* + * Entry might not have been a user entry with a uid, + * so free the dn just in case. + */ + if(dn) + free(dn); + } + if (rval) break; /* PR_GetLine failed */ } out: PR_Close(fd); -- 1.8.1.4