]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
fix config emit (ITS#6986)
authorPierangelo Masarati <ando@OpenLDAP.org>
Thu, 7 Jul 2011 06:14:14 +0000 (08:14 +0200)
committerPierangelo Masarati <ando@OpenLDAP.org>
Thu, 7 Jul 2011 06:16:23 +0000 (08:16 +0200)
servers/slapd/overlays/constraint.c

index fcb2830ee88cbf2e45d344ba3537fdfac10ee36e..e6a9267ba7d15e3639e900b97e22584e98b596b2 100644 (file)
@@ -145,6 +145,8 @@ constraint_cf_gen( ConfigArgs *c )
                                char *tstr = NULL;
                                int quotes = 0;
                                int j;
+                               size_t val;
+                               char val_buf[SLAP_TEXT_BUFLEN] = { '\0' };
 
                                bv.bv_len = STRLENOF("  ");
                                for (j = 0; cp->ap[j]; j++) {
@@ -156,6 +158,7 @@ constraint_cf_gen( ConfigArgs *c )
 
                                if (cp->re) {
                                        tstr = REGEX_STR;
+                                       quotes = 1;
                                } else if (cp->lud) {
                                        tstr = URI_STR;
                                        quotes = 1;
@@ -164,8 +167,10 @@ constraint_cf_gen( ConfigArgs *c )
                                        quotes = 1;
                                } else if (cp->size) {
                                        tstr = SIZE_STR;
+                                       val = cp->size;
                                } else if (cp->count) {
                                        tstr = COUNT_STR;
+                                       val = cp->count;
                                }
 
                                bv.bv_len += strlen(tstr);
@@ -175,6 +180,15 @@ constraint_cf_gen( ConfigArgs *c )
                                        bv.bv_len += cp->restrict_val.bv_len + STRLENOF(" restrict=\"\"");
                                }
 
+                               if (cp->count || cp->size) {
+                                       int len = snprintf(val_buf, sizeof(val_buf), "%d", val);
+                                       if (len <= 0) {
+                                               /* error */
+                                               return -1;
+                                       }
+                                       bv.bv_len += len;
+                               }
+
                                s = bv.bv_val = ch_malloc(bv.bv_len + 1);
 
                                s = lutil_strncopy( s, cp->ap[0]->ad_cname.bv_val, cp->ap[0]->ad_cname.bv_len );
@@ -185,9 +199,13 @@ constraint_cf_gen( ConfigArgs *c )
                                *s++ = ' ';
                                s = lutil_strcopy( s, tstr );
                                *s++ = ' ';
-                               if ( quotes ) *s++ = '"';
-                               s = lutil_strncopy( s, cp->val.bv_val, cp->val.bv_len );
-                               if ( quotes ) *s++ = '"';
+                               if (cp->count || cp->size) {
+                                       s = lutil_strcopy( s, val_buf );
+                               } else {
+                                       if ( quotes ) *s++ = '"';
+                                       s = lutil_strncopy( s, cp->val.bv_val, cp->val.bv_len );
+                                       if ( quotes ) *s++ = '"';
+                               }
                                if (cp->restrict_lud != NULL) {
                                        s = lutil_strcopy( s, " restrict=\"" );
                                        s = lutil_strncopy( s, cp->restrict_val.bv_val, cp->restrict_val.bv_len );
@@ -471,7 +489,7 @@ constraint_cf_gen( ConfigArgs *c )
                                                        }
                                                }
 
-                                               ber_str2bv(c->argv[argidx], 0, 1, &ap.restrict_val);
+                                               ber_str2bv(c->argv[argidx] + STRLENOF("restrict="), 0, 1, &ap.restrict_val);
 
                                        } else {
                                                /* cleanup */