浏览代码

Bug 690584 - #10652 #10651 #10650 #10649 #10648 #10647 send_specific_attrs send_all_attrs - fix coverity resource leak issues

https://bugzilla.redhat.com/show_bug.cgi?id=690584
Resolves: bug 690584
Bug Description: #10652 #10651 #10650 #10649 #10648 #10647 send_specific_attrs send_all_attrs - fix coverity resource leak issues
Reviewed by: nhosoi (Thanks!)
Branch: master
Fix Description: if there is an error, we still have to free the values allocated
by slapi_vattr_namespace_values_get_sp() - so just continue the for loop, but if
rc != 0 just free the remaining values and continue
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: no
Rich Megginson 14 年之前
父节点
当前提交
3e97d377e0
共有 1 个文件被更改,包括 19 次插入6 次删除
  1. 19 6
      ldap/servers/slapd/result.c

+ 19 - 6
ldap/servers/slapd/result.c

@@ -995,6 +995,13 @@ static int send_all_attrs(Slapi_Entry *e,char **attrs,Slapi_Operation *op,Slapi_
 
 
 				for(iter=0; iter<item_count; iter++)
 				for(iter=0; iter<item_count; iter++)
 				{
 				{
+					if ( rc != 0 ) {
+						/* we hit an error - we need to free all of the stuff allocated by
+						   slapi_vattr_namespace_values_get_sp */
+						slapi_vattr_values_free(&(values[iter]), &(actual_type_name[iter]), attr_free_flags);
+						continue;
+					}
+
 					if (SLAPI_VIRTUALATTRS_TYPE_NAME_MATCHED_SUBTYPE == type_name_disposition[iter]) {
 					if (SLAPI_VIRTUALATTRS_TYPE_NAME_MATCHED_SUBTYPE == type_name_disposition[iter]) {
 						name_to_return = actual_type_name[iter]; 
 						name_to_return = actual_type_name[iter]; 
 					}
 					}
@@ -1028,14 +1035,14 @@ static int send_all_attrs(Slapi_Entry *e,char **attrs,Slapi_Operation *op,Slapi_
 					}
 					}
 
 
 					slapi_vattr_values_free(&(values[iter]), &(actual_type_name[iter]), attr_free_flags);
 					slapi_vattr_values_free(&(values[iter]), &(actual_type_name[iter]), attr_free_flags);
-    				if ( rc != 0 ) {
-						goto exit;
-    				}
 				}
 				}
 
 
 				slapi_ch_free((void**)&actual_type_name);
 				slapi_ch_free((void**)&actual_type_name);
 				slapi_ch_free((void**)&type_name_disposition);
 				slapi_ch_free((void**)&type_name_disposition);
 				slapi_ch_free((void**)&values);
 				slapi_ch_free((void**)&values);
+				if ( rc != 0 ) {
+					goto exit;
+				}
 
 
 			} else {
 			} else {
 				rc = 0;
 				rc = 0;
@@ -1121,6 +1128,12 @@ int send_specific_attrs(Slapi_Entry *e,char **attrs,Slapi_Operation *op,Slapi_PB
 
 
 				for(iter=0; iter<item_count; iter++)
 				for(iter=0; iter<item_count; iter++)
 				{
 				{
+					if ( rc != 0 ) {
+						/* we hit an error - we need to free all of the stuff allocated by
+						   slapi_vattr_namespace_values_get_sp */
+						slapi_vattr_values_free(&(values[iter]), &(actual_type_name[iter]), attr_free_flags);
+						continue;
+					}
 					if (SLAPI_VIRTUALATTRS_TYPE_NAME_MATCHED_SUBTYPE == type_name_disposition[iter]) {
 					if (SLAPI_VIRTUALATTRS_TYPE_NAME_MATCHED_SUBTYPE == type_name_disposition[iter]) {
 						name_to_return = actual_type_name[iter]; 
 						name_to_return = actual_type_name[iter]; 
 					} else {
 					} else {
@@ -1154,14 +1167,14 @@ int send_specific_attrs(Slapi_Entry *e,char **attrs,Slapi_Operation *op,Slapi_PB
 						rc = encode_attr_2( pb, ber, e, values[iter], attrsonly, current_type_name, name_to_return );
 						rc = encode_attr_2( pb, ber, e, values[iter], attrsonly, current_type_name, name_to_return );
 					
 					
 					slapi_vattr_values_free(&(values[iter]), &(actual_type_name[iter]), attr_free_flags);
 					slapi_vattr_values_free(&(values[iter]), &(actual_type_name[iter]), attr_free_flags);
-    				if ( rc != 0 ) {
-						goto exit;
-    				}
 				}
 				}
 
 
 				slapi_ch_free((void**)&actual_type_name);
 				slapi_ch_free((void**)&actual_type_name);
 				slapi_ch_free((void**)&type_name_disposition);
 				slapi_ch_free((void**)&type_name_disposition);
 				slapi_ch_free((void**)&values);
 				slapi_ch_free((void**)&values);
+				if ( rc != 0 ) {
+					goto exit;
+				}
 
 
 			} else {
 			} else {
 				rc = 0;
 				rc = 0;