]> git.sur5r.net Git - openldap/commitdiff
ITS#6159
authorQuanah Gibson-Mount <quanah@openldap.org>
Wed, 3 Jun 2009 01:03:45 +0000 (01:03 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Wed, 3 Jun 2009 01:03:45 +0000 (01:03 +0000)
CHANGES
servers/slapd/bconfig.c
servers/slapd/limits.c
servers/slapd/proto-slap.h

diff --git a/CHANGES b/CHANGES
index 22ea83b96da2b6c4f622451843e8977ca764cc57..9eeab434958c977b617a7a8f53cdfee0bce3e384 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -14,6 +14,7 @@ OpenLDAP 2.4.17 Engineering
        Fixed slapd global alloc handling (ITS#6054)
        Fixed slapd moduleload with static backends and modules (ITS#6016)
        Fixed slapd normalization of updated schema attributes (ITS#5540)
+       Fixed slapd olcLimits handling (ITS#6159)
        Fixed slapd pagedresults stacked control with overlays (ITS#6056)
        Fixed slapd password-hash incorrect limit on arg length (ITS#6139)
        Fixed slapd readonly restrictions (ITS#6109)
index fae59ceb3bde15d5d341280e4ea65559b791c579..37c4ff6f3cbb5cb3089a62cc4b77a2572a3b5aff 100644 (file)
@@ -1385,6 +1385,36 @@ config_generic(ConfigArgs *c) {
 
                case CFG_LIMITS:
                        /* FIXME: there is no limits_free function */
+                       if ( c->valx < 0 ) {
+                               limits_destroy( c->be->be_limits );
+                               c->be->be_limits = NULL;
+
+                       } else {
+                               int cnt, num = -1;
+
+                               if ( c->be->be_limits ) {
+                                       for ( num = 0; c->be->be_limits[ num ]; num++ )
+                                               /* just count */ ;
+                               }
+
+                               if ( c->valx >= num ) {
+                                       return 1;
+                               }
+
+                               if ( num == 1 ) {
+                                       limits_destroy( c->be->be_limits );
+                                       c->be->be_limits = NULL;
+
+                               } else {
+                                       limits_free_one( c->be->be_limits[ c->valx ] );
+
+                                       for ( cnt = c->valx; cnt < num; cnt++ ) {
+                                               c->be->be_limits[ cnt ] = c->be->be_limits[ cnt + 1 ];
+                                       }
+                               }
+                       }
+                       break;
+
                case CFG_ATOPT:
                        /* FIXME: there is no ad_option_free function */
                case CFG_ROOTDSE:
index 796149c4b3c508cb8ad70804916d2dcc29909bdf..cf22aed463252dbad93f1bf41a5822f42c053b8f 100644 (file)
@@ -1324,6 +1324,19 @@ limits_check( Operation *op, SlapReply *rs )
        return 0;
 }
 
+void
+limits_free_one( 
+       struct slap_limits      *lm )
+{
+       if ( ( lm->lm_flags & SLAP_LIMITS_MASK ) == SLAP_LIMITS_REGEX )
+               regfree( &lm->lm_regex );
+
+       if ( !BER_BVISNULL( &lm->lm_pat ) )
+               ch_free( lm->lm_pat.bv_val );
+
+       ch_free( lm );
+}
+
 void
 limits_destroy( 
        struct slap_limits      **lm )
@@ -1335,13 +1348,7 @@ limits_destroy(
        }
 
        for ( i = 0; lm[ i ]; i++ ) {
-               if ( (lm[ i ]->lm_flags & SLAP_LIMITS_MASK) == SLAP_LIMITS_REGEX )
-                       regfree( &lm[ i ]->lm_regex );
-
-               if ( !BER_BVISNULL( &lm[ i ]->lm_pat ) )
-                       ch_free( lm[ i ]->lm_pat.bv_val );
-
-               ch_free( lm[ i ] );
+               limits_free_one( lm[ i ] );
        }
 
        ch_free( lm );
index afa95ac91f56340da0a00dc2198f31ba43aeacaf..982fb8d0ff59b1602a6ae2737fb2fea7e9a5d5ef 100644 (file)
@@ -1144,6 +1144,8 @@ LDAP_SLAPD_F (int) limits_unparse_one LDAP_P((
        struct slap_limits_set *limit, int which, struct berval *bv, ber_len_t buflen ));
 LDAP_SLAPD_F (int) limits_unparse LDAP_P(( 
        struct slap_limits *limit, struct berval *bv, ber_len_t buflen ));
+LDAP_SLAPD_F (void) limits_free_one LDAP_P(( 
+       struct slap_limits      *lm ));
 LDAP_SLAPD_F (void) limits_destroy LDAP_P(( struct slap_limits **lm ));
 
 /*