Pārlūkot izejas kodu

Resolves: #459302
Summary: SASL MAP: memory leak in sasl_map_init
Fix Description: sasl_map_done put just comments to free the map list and the
private structure, but not implemented them. Added the code to release the map
list and the private structure.

Noriko Hosoi 17 gadi atpakaļ
vecāks
revīzija
25bd3c05de
1 mainītis faili ar 20 papildinājumiem un 3 dzēšanām
  1. 20 3
      ldap/servers/slapd/sasl_map.c

+ 20 - 3
ldap/servers/slapd/sasl_map.c

@@ -101,7 +101,6 @@ sasl_map_private *sasl_map_new_private()
 	return new_priv;
 }
 
-#if 0 /* unused for now */
 static void 
 sasl_map_free_private(sasl_map_private **priv)
 {
@@ -109,7 +108,6 @@ sasl_map_free_private(sasl_map_private **priv)
 	slapi_ch_free((void**)priv);
 	*priv = NULL;
 }
-#endif
 
 /* This function does a shallow copy on the payload data supplied, so the caller should not free it, and it needs to be allocated using slapi_ch_malloc() */
 static 
@@ -132,6 +130,10 @@ sasl_map_data *sasl_map_next(sasl_map_data *dp)
 static void 
 sasl_map_free_data(sasl_map_data **dp)
 {
+	slapi_ch_free_string(&(*dp)->name);
+	slapi_ch_free_string(&(*dp)->regular_expression);
+	slapi_ch_free_string(&(*dp)->template_base_dn);
+	slapi_ch_free_string(&(*dp)->template_search_filter);
 	slapi_ch_free((void**)dp);
 }
 
@@ -287,7 +289,8 @@ sasl_map_config_parse_entry(Slapi_Entry *entry, sasl_map_data **new_dp)
 	filtertemplate = slapi_entry_attr_get_charptr( entry, "nsSaslMapFilterTemplate" );
 	map_name = slapi_entry_attr_get_charptr( entry, "cn" );
 
-	if ( (NULL == regex) || (NULL == basedntemplate) || (NULL == filtertemplate) ) {
+	if ( (NULL == map_name) || (NULL == regex) ||
+		 (NULL == basedntemplate) || (NULL == filtertemplate) ) {
 		/* Invalid entry */
 		ret = -1;
 	} else {
@@ -296,6 +299,7 @@ sasl_map_config_parse_entry(Slapi_Entry *entry, sasl_map_data **new_dp)
 	}
 
 	if (ret) {
+		slapi_ch_free((void **) &map_name);
 		slapi_ch_free((void **) &regex);
 		slapi_ch_free((void **) &basedntemplate);
 		slapi_ch_free((void **) &filtertemplate);
@@ -405,8 +409,21 @@ int sasl_map_init()
 int sasl_map_done()
 {
 	int ret = 0;
+	sasl_map_private *priv = sasl_map_get_global_priv();
+	sasl_map_data *dp = NULL;
+
 	/* Free the map list */
+	PR_Lock(priv->lock);
+	dp = priv->map_data_list;
+	while (dp) {
+		sasl_map_data *dp_next = dp->next;
+		sasl_map_free_data(&dp);
+		dp = dp_next;
+	}
+	PR_Unlock(priv->lock);
+
 	/* Free the private structure */
+	sasl_map_free_private(&priv);
 	return ret;
 }