]> git.sur5r.net Git - openldap/commitdiff
fix ITS#3140
authorPierangelo Masarati <ando@openldap.org>
Wed, 12 May 2004 23:29:42 +0000 (23:29 +0000)
committerPierangelo Masarati <ando@openldap.org>
Wed, 12 May 2004 23:29:42 +0000 (23:29 +0000)
servers/slapd/acl.c
servers/slapd/aclparse.c

index 23abde734f17c7e8b0df39829ff78ecc9f688b29..4f75c60df4e721b3b5b63b20c96f3e72dfdaa940 100644 (file)
@@ -72,7 +72,8 @@ static struct berval
        aci_bv_group_class      = BER_BVC(SLAPD_GROUP_CLASS),
        aci_bv_group_attr       = BER_BVC(SLAPD_GROUP_ATTR),
        aci_bv_role_class       = BER_BVC(SLAPD_ROLE_CLASS),
-       aci_bv_role_attr        = BER_BVC(SLAPD_ROLE_ATTR);
+       aci_bv_role_attr        = BER_BVC(SLAPD_ROLE_ATTR),
+       aci_bv_set_attr         = BER_BVC(SLAPD_ACI_SET_ATTR);
 
 
 static AccessControl * acl_get(
@@ -1745,8 +1746,7 @@ aci_get_part(
        char *p;
 
        if (bv) {
-               bv->bv_len = 0;
-               bv->bv_val = NULL;
+               BER_BVZERO( bv );
        }
        len = list->bv_len;
        p = list->bv_val;
@@ -1805,63 +1805,62 @@ aci_match_set (
        int setref
 )
 {
-       struct berval set = BER_BVNULL;
-       int rc = 0;
-       AciSetCookie cookie;
+       struct berval   set = BER_BVNULL;
+       int             rc = 0;
+       AciSetCookie    cookie;
+       Operation       op2 = *op;
+
+       op2.o_conn = NULL;
 
        if (setref == 0) {
-               ber_dupbv_x( &set, subj, op->o_tmpmemctx );
+               ber_dupbv_x( &set, subj, op2.o_tmpmemctx );
        } else {
-               struct berval subjdn, ndn = BER_BVNULL;
-               struct berval setat;
-               BerVarray bvals;
-               const char *text;
-               AttributeDescription *desc = NULL;
+               struct berval           subjdn, ndn = BER_BVNULL;
+               struct berval           setat;
+               BerVarray               bvals;
+               const char              *text;
+               AttributeDescription    *desc = NULL;
 
                /* format of string is "entry/setAttrName" */
-               if (aci_get_part(subj, 0, '/', &subjdn) < 0) {
+               if ( aci_get_part( subj, 0, '/', &subjdn ) < 0 ) {
                        return(0);
                }
 
-               if ( aci_get_part(subj, 1, '/', &setat) < 0 ) {
-                       setat.bv_val = SLAPD_ACI_SET_ATTR;
-                       setat.bv_len = sizeof(SLAPD_ACI_SET_ATTR)-1;
+               if ( aci_get_part( subj, 1, '/', &setat ) < 0 ) {
+                       setat = aci_bv_set_attr;
                }
 
-               if ( setat.bv_val != NULL ) {
-                       /*
-                        * NOTE: dnNormalize honors the ber_len field
-                        * as the length of the dn to be normalized
-                        */
-                       if ( dnNormalize(0, NULL, NULL, &subjdn, &ndn, op->o_tmpmemctx) == LDAP_SUCCESS
-                               && slap_bv2ad(&setat, &desc, &text) == LDAP_SUCCESS )
+               /*
+                * NOTE: dnNormalize honors the ber_len field
+                * as the length of the dn to be normalized
+                */
+               if ( slap_bv2ad( &setat, &desc, &text ) == LDAP_SUCCESS ) {
+                       if ( dnNormalize( 0, NULL, NULL, &subjdn, &ndn, op2.o_tmpmemctx ) == LDAP_SUCCESS )
                        {
-                               backend_attribute(op, e,
-                                       &ndn, desc, &bvals);
-                               if ( bvals != NULL ) {
-                                       if ( bvals[0].bv_val != NULL ) {
-                                               int i;
-                                               set = bvals[0];
-                                               bvals[0].bv_val = NULL;
-                                               for (i=1;bvals[i].bv_val;i++);
-                                               bvals[0].bv_val = bvals[i-1].bv_val;
-                                               bvals[i-1].bv_val = NULL;
-                                       }
-                                       ber_bvarray_free_x(bvals, op->o_tmpmemctx);
+                               backend_attribute( &op2, e, &ndn, desc, &bvals );
+                               if ( bvals != NULL && !BER_BVISNULL( &bvals[0] ) ) {
+                                       int     i;
+
+                                       set = bvals[0];
+                                       BER_BVZERO( &bvals[0] );
+                                       for ( i = 1; !BER_BVISNULL( &bvals[i] ); i++ );
+                                       bvals[0].bv_val = bvals[i-1].bv_val;
+                                       BER_BVZERO( &bvals[i-1] );
                                }
+                               ber_bvarray_free_x( bvals, op2.o_tmpmemctx );
+                               slap_sl_free( ndn.bv_val, op2.o_tmpmemctx );
                        }
-                       if (ndn.bv_val)
-                               free(ndn.bv_val);
                }
        }
 
-       if (set.bv_val != NULL) {
-               cookie.op = op;
+       if ( !BER_BVISNULL( &set ) ) {
+               cookie.op = &op2;
                cookie.e = e;
-               rc = (slap_set_filter(aci_set_gather, (SetCookie *)&cookie, &set,
-                       &op->o_ndn, &e->e_nname, NULL) > 0);
-               slap_sl_free(set.bv_val, op->o_tmpmemctx);
+               rc = ( slap_set_filter( aci_set_gather, (SetCookie *)&cookie, &set,
+                       &op2.o_ndn, &e->e_nname, NULL ) > 0 );
+               slap_sl_free( set.bv_val, op2.o_tmpmemctx );
        }
+
        return(rc);
 }
 
index efec82f90496e574a76dfd735fadf82e5c97b047..b554fe0f2a619b72b2c825417dc72942d5928cdc 100644 (file)
@@ -143,7 +143,7 @@ check_scope( BackendDB *be, AccessControl *a )
 
        dn = be->be_nsuffix[ 0 ];
 
-       if ( a->acl_dn_pat.bv_len || ( a->acl_dn_style != ACL_STYLE_REGEX ) ) {
+       if ( a->acl_dn_pat.bv_len || a->acl_dn_style != ACL_STYLE_REGEX ) {
                slap_style_t    style = a->acl_dn_style;
 
                if ( style == ACL_STYLE_REGEX ) {