X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Foverlays%2Funique.c;h=54414823f9e440484690bbc1da9454b22b8f54a0;hb=2317211a8f7b1a50862bd16c29d208b62fbb387b;hp=5075d20db73a12ddc0f71999bdb835e4164d0114;hpb=bfa0d158345bfd0d70e4003617d083716f5860a2;p=openldap diff --git a/servers/slapd/overlays/unique.c b/servers/slapd/overlays/unique.c index 5075d20db7..54414823f9 100644 --- a/servers/slapd/overlays/unique.c +++ b/servers/slapd/overlays/unique.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2004-2007 The OpenLDAP Foundation. + * Copyright 2004-2008 The OpenLDAP Foundation. * Portions Copyright 2004,2006-2007 Symas Corporation. * All rights reserved. * @@ -190,7 +190,7 @@ unique_new_domain_uri ( unique_domain_uri **urip, uri->ndn, NULL ); if ( rc != LDAP_SUCCESS ) { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> invalid DN %d (%s)", url_desc->lud_dn, rc, ldap_err2string( rc )); rc = ARG_BAD_CONF; @@ -198,7 +198,7 @@ unique_new_domain_uri ( unique_domain_uri **urip, } if ( !dnIsSuffix ( uri->ndn, &be->be_nsuffix[0] ) ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "dn <%s> is not a suffix of backend base dn <%s>", uri->dn->bv_val, be->be_nsuffix[0].bv_val ); @@ -220,7 +220,7 @@ unique_new_domain_uri ( unique_domain_uri **urip, attr->next = uri->attrs; uri->attrs = attr; } else { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "unique: attribute: %s: %s", attr_str[i], text ); rc = ARG_BAD_CONF; @@ -231,7 +231,7 @@ unique_new_domain_uri ( unique_domain_uri **urip, uri->scope = url_desc->lud_scope; if ( !uri->scope ) { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "unique: uri with base scope will always be unique"); rc = ARG_BAD_CONF; goto exit; @@ -242,7 +242,7 @@ unique_new_domain_uri ( unique_domain_uri **urip, uri->filter = ber_str2bv( url_desc->lud_filter, 0, 1, NULL); f = str2filter( uri->filter->bv_val ); if ( !f ) { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "unique: bad filter"); rc = ARG_BAD_CONF; goto exit; @@ -255,7 +255,7 @@ exit: *urip = uri; if ( rc ) { Debug ( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); unique_free_domain_uri ( uri ); *urip = NULL; } @@ -326,7 +326,7 @@ unique_new_domain ( unique_domain **domainp, } rc = ldap_url_parselist_ext ( &url_descs, uri_start, " ", 0 ); if ( rc ) { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "<%s> invalid ldap urilist", uri_start ); rc = ARG_BAD_CONF; @@ -352,7 +352,7 @@ exit: *domainp = domain; if ( rc ) { Debug ( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); unique_free_domain ( domain ); *domainp = NULL; } @@ -401,19 +401,19 @@ unique_cf_base( ConfigArgs *c ) case LDAP_MOD_ADD: case SLAP_CONFIG_ADD: if ( domains ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "cannot set legacy attrs when URIs are present" ); Debug ( LDAP_DEBUG_CONFIG, "unique config: %s\n", - c->msg, NULL, NULL ); + c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } if ( !dnIsSuffix ( &c->value_ndn, &be->be_nsuffix[0] ) ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "dn is not a suffix of backend base" ); Debug ( LDAP_DEBUG_CONFIG, "unique config: %s\n", - c->msg, NULL, NULL ); + c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } @@ -499,10 +499,10 @@ unique_cf_attrs( ConfigArgs *c ) case LDAP_MOD_ADD: case SLAP_CONFIG_ADD: if ( domains ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "cannot set legacy attrs when URIs are present" ); Debug ( LDAP_DEBUG_CONFIG, "unique config: %s\n", - c->msg, NULL, NULL ); + c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } @@ -510,10 +510,10 @@ unique_cf_attrs( ConfigArgs *c ) && legacy->uri && legacy->uri->attrs && (c->type == UNIQUE_IGNORE) != legacy->ignore ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "cannot set both attrs and ignore-attrs" ); Debug ( LDAP_DEBUG_CONFIG, "unique config: %s\n", - c->msg, NULL, NULL ); + c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } @@ -538,7 +538,7 @@ unique_cf_attrs( ConfigArgs *c ) attr->next = new_attrs; new_attrs = attr; } else { - snprintf( c->msg, sizeof( c->msg ), + snprintf( c->cr_msg, sizeof( c->cr_msg ), "unique: attribute: %s: %s", c->argv[i], text ); for ( attr = new_attrs; @@ -575,7 +575,7 @@ unique_cf_attrs( ConfigArgs *c ) if ( rc ) { Debug ( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); } return rc; } @@ -620,10 +620,10 @@ unique_cf_strict( ConfigArgs *c ) case LDAP_MOD_ADD: case SLAP_CONFIG_ADD: if ( domains ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "cannot set legacy attrs when URIs are present" ); Debug ( LDAP_DEBUG_CONFIG, "unique config: %s\n", - c->msg, NULL, NULL ); + c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } @@ -692,7 +692,7 @@ unique_cf_uri( ConfigArgs *c ) * test024 Will hit this case in such a * situation. */ - assert (*domainp); + assert (*domainp != NULL); domain = *domainp; *domainp = domain->next; @@ -705,10 +705,10 @@ unique_cf_uri( ConfigArgs *c ) case SLAP_CONFIG_ADD: /* fallthrough */ case LDAP_MOD_ADD: if ( legacy ) { - sprintf ( c->msg, + snprintf( c->cr_msg, sizeof( c->cr_msg ), "cannot set Uri when legacy attrs are present" ); Debug ( LDAP_DEBUG_CONFIG, "unique config: %s\n", - c->msg, NULL, NULL ); + c->cr_msg, NULL, NULL ); rc = ARG_BAD_CONF; break; } @@ -740,7 +740,8 @@ unique_cf_uri( ConfigArgs *c ) static int unique_db_init( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *)be->bd_info; @@ -755,7 +756,8 @@ unique_db_init( static int unique_db_destroy( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *)be->bd_info; @@ -779,7 +781,8 @@ unique_db_destroy( static int unique_open( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { Debug(LDAP_DEBUG_TRACE, "unique_open: overlay initialized\n", 0, 0, 0); @@ -795,7 +798,8 @@ unique_open( static int unique_close( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *) be->bd_info; @@ -898,6 +902,7 @@ build_filter( AttributeDescription *ad, BerVarray b, char *kp, + int ks, void *ctx ) { @@ -919,15 +924,21 @@ build_filter( if ( b && b[0].bv_val ) { for ( i = 0; b[i].bv_val; i++ ) { struct berval bv; + int len; ldap_bv2escaped_filter_value_x( &b[i], &bv, 1, ctx ); - kp += sprintf( kp, "(%s=%s)", ad->ad_cname.bv_val, bv.bv_val ); + len = snprintf( kp, ks, "(%s=%s)", ad->ad_cname.bv_val, bv.bv_val ); + assert( len >= 0 && len < ks ); + kp += len; if ( bv.bv_val != b[i].bv_val ) { ber_memfree_x( bv.bv_val, ctx ); } } } else if ( domain->strict ) { - kp += sprintf( kp, "(%s=*)", ad->ad_cname.bv_val ); + int len; + len = snprintf( kp, ks, "(%s=*)", ad->ad_cname.bv_val ); + assert( len >= 0 && len < ks ); + kp += len; } break; } @@ -1016,13 +1027,16 @@ unique_add( for ( domain = legacy ? legacy : domains; domain; - domain = domain->next ) { + domain = domain->next ) + { unique_domain_uri *uri; int ks = 0; for ( uri = domain->uri; uri; - uri = uri->next ) { + uri = uri->next ) + { + int len; if ( uri->ndn && !dnIsSuffix( &op->o_req_ndn, uri->ndn )) @@ -1051,9 +1065,14 @@ unique_add( ks += uri->filter->bv_len + STRLENOF ("(&)"); kp = key = op->o_tmpalloc(ks, op->o_tmpmemctx); - if ( uri->filter && uri->filter->bv_len ) - kp += sprintf (kp, "(&%s", uri->filter->bv_val); - kp += sprintf(kp, "(|"); + if ( uri->filter && uri->filter->bv_len ) { + len = snprintf (kp, ks, "(&%s", uri->filter->bv_val); + assert( len >= 0 && len < ks ); + kp += len; + } + len = snprintf(kp, ks - (kp - key), "(|"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; for(a = op->ora_e->e_attrs; a; a = a->a_next) kp = build_filter(domain, @@ -1061,11 +1080,17 @@ unique_add( a->a_desc, a->a_vals, kp, + ks - ( kp - key ), op->o_tmpmemctx); - kp += sprintf(kp, ")"); - if ( uri->filter && uri->filter->bv_len ) - kp += sprintf (kp, ")"); + len = snprintf(kp, ks - (kp - key), ")"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; + if ( uri->filter && uri->filter->bv_len ) { + len = snprintf(kp, ks - (kp - key), ")"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; + } rc = unique_search ( op, &nop, @@ -1106,13 +1131,16 @@ unique_modify( for ( domain = legacy ? legacy : domains; domain; - domain = domain->next ) { + domain = domain->next ) + { unique_domain_uri *uri; int ks = 0; for ( uri = domain->uri; uri; - uri = uri->next ) { + uri = uri->next ) + { + int len; if ( uri->ndn && !dnIsSuffix( &op->o_req_ndn, uri->ndn )) @@ -1142,9 +1170,14 @@ unique_modify( ks += uri->filter->bv_len + STRLENOF ("(&)"); kp = key = op->o_tmpalloc(ks, op->o_tmpmemctx); - if ( uri->filter && uri->filter->bv_len ) - kp += sprintf (kp, "(&%s", uri->filter->bv_val); - kp += sprintf(kp, "(|"); + if ( uri->filter && uri->filter->bv_len ) { + len = snprintf(kp, ks, "(&%s", uri->filter->bv_val); + assert( len >= 0 && len < ks ); + kp += len; + } + len = snprintf(kp, ks - (kp - key), "(|"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; for(m = op->orm_modlist; m; m = m->sml_next) if ( (m->sml_op & LDAP_MOD_OP) @@ -1154,11 +1187,17 @@ unique_modify( m->sml_desc, m->sml_values, kp, + ks - (kp - key), op->o_tmpmemctx ); - kp += sprintf (kp, ")"); - if ( uri->filter && uri->filter->bv_len ) - kp += sprintf (kp, ")"); + len = snprintf(kp, ks - (kp - key), ")"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; + if ( uri->filter && uri->filter->bv_len ) { + len = snprintf (kp, ks - (kp - key), ")"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; + } rc = unique_search ( op, &nop, @@ -1200,14 +1239,16 @@ unique_modrdn( for ( domain = legacy ? legacy : domains; domain; - domain = domain->next ) { + domain = domain->next ) + { unique_domain_uri *uri; int ks = 0; for ( uri = domain->uri; uri; - uri = uri->next ) { - int i; + uri = uri->next ) + { + int i, len; if ( uri->ndn && !dnIsSuffix( &op->o_req_ndn, uri->ndn ) @@ -1259,9 +1300,14 @@ unique_modrdn( ks += uri->filter->bv_len + STRLENOF ("(&)"); kp = key = op->o_tmpalloc(ks, op->o_tmpmemctx); - if ( uri->filter && uri->filter->bv_len ) - kp += sprintf (kp, "(&%s", uri->filter->bv_val); - kp += sprintf(kp, "(|"); + if ( uri->filter && uri->filter->bv_len ) { + len = snprintf(kp, ks, "(&%s", uri->filter->bv_val); + assert( len >= 0 && len < ks ); + kp += len; + } + len = snprintf(kp, ks - (kp - key), "(|"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; for ( i=0; newrdn[i]; i++) { bv[0] = newrdn[i]->la_value; @@ -1270,12 +1316,18 @@ unique_modrdn( newrdn[i]->la_private, bv, kp, + ks - (kp - key ), op->o_tmpmemctx); } - kp += sprintf(kp, ")"); - if ( uri->filter && uri->filter->bv_len ) - kp += sprintf (kp, ")"); + len = snprintf(kp, ks - (kp - key), ")"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; + if ( uri->filter && uri->filter->bv_len ) { + len = snprintf (kp, ks - (kp - key), ")"); + assert( len >= 0 && len < ks - (kp - key) ); + kp += len; + } rc = unique_search ( op, &nop,