+ if (rs->sr_ctrls) {
+ int i, j, k;
+ LDAPControl **newctrls;
+
+ for (i=0; rs->sr_ctrls[i]; i++);
+
+ j = gs->nctrls;
+ if (!j) {
+ newctrls = ch_malloc((i+1)*sizeof(LDAPControl *));
+ } else {
+ /* Forget old pagedResults response if we're sending
+ * a new one now
+ */
+ if ( get_pagedresults( op ) > SLAP_CONTROL_IGNORED ) {
+ int newpage = 0;
+ for ( k=0; k<i; k++ ) {
+ if ( !strcmp(rs->sr_ctrls[k]->ldctl_oid,
+ LDAP_CONTROL_PAGEDRESULTS )) {
+ newpage = 1;
+ break;
+ }
+ }
+ if ( newpage ) {
+ for ( k=0; k<j; k++ ) {
+ if ( !strcmp(gs->ctrls[k]->ldctl_oid,
+ LDAP_CONTROL_PAGEDRESULTS )) {
+ gs->ctrls[k]->ldctl_oid = NULL;
+ ldap_control_free( gs->ctrls[k] );
+ gs->ctrls[k] = gs->ctrls[--j];
+ gs->ctrls[j] = NULL;
+ break;
+ }
+ }
+ }
+ }
+ newctrls = ch_realloc(gs->ctrls,
+ (j+i+1)*sizeof(LDAPControl *));
+ }
+ for (k=0; k<i; j++,k++) {
+ newctrls[j] = ch_malloc(sizeof(LDAPControl));
+ *newctrls[j] = *rs->sr_ctrls[k];
+ if ( !BER_BVISNULL( &rs->sr_ctrls[k]->ldctl_value ))
+ ber_dupbv( &newctrls[j]->ldctl_value,
+ &rs->sr_ctrls[k]->ldctl_value );
+ }
+ newctrls[j] = NULL;
+ gs->nctrls = j;
+ gs->ctrls = newctrls;
+ }