Browse Source

Ticket 47532 - 1.3.1 with mozldap crashes in new operation work_q code

Bug Description:  The changes from ticket 513 seem to trigger two crashes when using mozldap.

Fix Description:  When freeing a operation/ber we need to check if the ber is NULL, and
                  when getting a operation from the stack and stack operation is NULL,
                  we need to create a new operaton, and not try to init the empty one.

https://fedorahosted.org/389/ticket/47532

Reviewed by: rmeggins(Thanks!)
Mark Reynolds 12 years ago
parent
commit
65aa3e0286
2 changed files with 11 additions and 4 deletions
  1. 7 2
      ldap/servers/slapd/connection.c
  2. 4 2
      ldap/servers/slapd/operation.c

+ 7 - 2
ldap/servers/slapd/connection.c

@@ -138,8 +138,13 @@ connection_get_operation(void)
 				plugin_get_server_plg() ));
 	} else {
 		PR_AtomicDecrement(&op_stack_size);
-		operation_init(stack_obj->op,
-			       plugin_build_operation_action_bitmap( 0, plugin_get_server_plg() ));
+		if(!stack_obj->op){
+			stack_obj->op = operation_new( plugin_build_operation_action_bitmap( 0,
+				plugin_get_server_plg() ));
+		} else {
+			operation_init(stack_obj->op,
+				plugin_build_operation_action_bitmap( 0, plugin_get_server_plg() ));
+		}
 	}
 	return stack_obj;
 }

+ 4 - 2
ldap/servers/slapd/operation.c

@@ -254,8 +254,10 @@ operation_done( Slapi_Operation **op, Connection *conn )
 			ber_init2((*op)->o_ber, NULL, options);
 		}
 #else
-		ber_special_free(*op, (*op)->o_ber); /* have to free everything here */
-		*op = NULL;
+		if((*op)->o_ber){
+			ber_special_free(*op, (*op)->o_ber); /* have to free everything here */
+			*op = NULL;
+		}
 #endif
 	}
 }