diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c
index 4ed535cd2cf703fbaf62c816b6ea5b40ab4c5b6b..48d839af4de0200581864e73323043695dca52f5 100644
--- a/servers/slapd/controls.c
+++ b/servers/slapd/controls.c
@@ -565,6 +565,27 @@ void slap_free_ctrls(
 {
 	int i;
 
+	if( op->o_assertion != NULL ) {
+		filter_free_x( op, op->o_assertion, 1 );
+		op->o_assertion = NULL;
+	}
+	if( op->o_vrFilter != NULL) {
+		vrFilter_free( op, op->o_vrFilter );
+		op->o_vrFilter = NULL;
+	}
+	if( op->o_preread_attrs != NULL ) {
+		op->o_tmpfree( op->o_preread_attrs, op->o_tmpmemctx );
+		op->o_preread_attrs = NULL;
+	}
+	if( op->o_postread_attrs != NULL ) {
+		op->o_tmpfree( op->o_postread_attrs, op->o_tmpmemctx );
+		op->o_postread_attrs = NULL;
+	}
+	if( op->o_pagedresults_state != NULL ) {
+		op->o_tmpfree( op->o_pagedresults_state, op->o_tmpmemctx );
+		op->o_pagedresults_state = NULL;
+	}
+
 	for (i=0; ctrls[i]; i++) {
 		op->o_tmpfree(ctrls[i], op->o_tmpmemctx );
 	}