]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/sets.c
don't return entry if requested attr is not present (ITS#5650)
[openldap] / servers / slapd / sets.c
index 372454ab35de9d028fa7afd1f01117a937d3b3f1..52f23306eff96c8852a1c72b388b59875410b1b3 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2007 The OpenLDAP Foundation.
+ * Copyright 2000-2008 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -200,6 +200,7 @@ slap_set_join(
                                                        cp->set_op->o_tmpfree( rset[ i ].bv_val, cp->set_op->o_tmpmemctx );
                                                        rset[ i ] = rset[ --rlast ];
                                                        BER_BVZERO( &rset[ rlast ] );
+                                                       i--;
                                                }
                                                exists = 1;
                                                break;
@@ -362,7 +363,7 @@ done2:;
 
                } else {
                        for ( i = 0; !BER_BVISNULL( &set[ i ] ); i++ ) {
-                               Debug( LDAP_DEBUG_ACL, "  ACL set[%d]=%s\n", i, set[i].bv_val, 0 );
+                               Debug( LDAP_DEBUG_ACL, "  ACL set[%ld]=%s\n", i, set[i].bv_val, 0 );
                        }
                }
        }
@@ -709,23 +710,23 @@ slap_set_filter( SLAP_SET_GATHER gatherer,
                        break;
 
                default:
-                       if ( ( c != '_' )
-                                       && ( c < 'A' || c > 'Z' )
-                                       && ( c < 'a' || c > 'z' ) )
-                       {
+                       if ( !AD_LEADCHAR( c ) ) {
                                SF_ERROR( syntax );
                        }
                        filter--;
                        for ( len = 1;
-                                       ( c = filter[ len ] )
-                                               && ( ( c >= '0' && c <= '9' )
-                                                       || ( c >= 'A' && c <= 'Z' )
-                                                       || ( c >= 'a' && c <= 'z' ) );
-                                       len++ )
-                               /* count */ ;
+                               ( c = filter[ len ] ) && AD_CHAR( c );
+                               len++ )
+                       {
+                               /* count */
+                               if ( c == '-' && !AD_CHAR( filter[ len + 1 ] ) ) {
+                                       break;
+                               }
+                       }
                        if ( len == 4
                                && memcmp( "this", filter, len ) == 0 )
                        {
+                               assert( !BER_BVISNULL( target ) );
                                if ( ( SF_TOP() == (void *)'/' ) || IS_SET( SF_TOP() ) ) {
                                        SF_ERROR( syntax );
                                }
@@ -746,15 +747,15 @@ slap_set_filter( SLAP_SET_GATHER gatherer,
                                if ( ( SF_TOP() == (void *)'/' ) || IS_SET( SF_TOP() ) ) {
                                        SF_ERROR( syntax );
                                }
+                               if ( BER_BVISNULL( user ) ) {
+                                       SF_ERROR( memory );
+                               }
                                set = cp->set_op->o_tmpcalloc( 2, sizeof( struct berval ),
                                                cp->set_op->o_tmpmemctx );
                                if ( set == NULL ) {
                                        SF_ERROR( memory );
                                }
                                ber_dupbv_x( set, user, cp->set_op->o_tmpmemctx );
-                               if ( BER_BVISNULL( set ) ) {
-                                       SF_ERROR( memory );
-                               }
                                BER_BVZERO( &set[ 1 ] );
                                
                        } else if ( SF_TOP() != (void *)'/' ) {