constraint overlay: fix config emit Author: Pierangelo Masarati Upstream ITS: #6986 Upstream commit: c0b669e14f4ef5b649f86bb3c1cc4ca76a00efa8 Resolves: #733067 diff --git a/servers/slapd/overlays/constraint.c b/servers/slapd/overlays/constraint.c index fcb2830..e6a9267 100644 --- a/servers/slapd/overlays/constraint.c +++ b/servers/slapd/overlays/constraint.c @@ -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 */