]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/search.c
fix access checking; fix operational attrs addition
[openldap] / servers / slapd / back-sql / search.c
index accaa533e7b426137e0d17ff1dea984ad49b2132..44b061777238892f449427af4bef90033241171c 100644 (file)
@@ -109,8 +109,6 @@ backsql_init_search(
        backsql_srch_info       *bsi, 
        struct berval           *nbase, 
        int                     scope, 
-       int                     slimit,
-       int                     tlimit,
        time_t                  stoptime, 
        Filter                  *filter, 
        SQLHDBC                 dbh,
@@ -127,8 +125,6 @@ backsql_init_search(
        BER_BVZERO( &bsi->bsi_base_id.eid_dn );
        BER_BVZERO( &bsi->bsi_base_id.eid_ndn );
        bsi->bsi_scope = scope;
-       bsi->bsi_slimit = slimit;
-       bsi->bsi_tlimit = tlimit;
        bsi->bsi_filter = filter;
        bsi->bsi_dbh = dbh;
        bsi->bsi_op = op;
@@ -253,7 +249,6 @@ backsql_init_search(
                }
        }
 
-       bsi->bsi_abandon = 0;
        bsi->bsi_id_list = NULL;
        bsi->bsi_id_listtail = &bsi->bsi_id_list;
        bsi->bsi_n_candidates = 0;
@@ -273,7 +268,7 @@ backsql_init_search(
                int     getentry = BACKSQL_IS_GET_ENTRY( flags );
                int     gotit = 0;
 
-               assert( op->o_bd->be_private );
+               assert( op->o_bd->be_private != NULL );
 
                rc = backsql_dn2id( op, rs, dbh, nbase, &bsi->bsi_base_id,
                                matched, 1 );
@@ -1248,10 +1243,10 @@ equality_match:;
 static int
 backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
 {
-       backsql_info    *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
-       int             rc;
+       backsql_info            *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private;
+       int                     rc;
 
-       assert( query );
+       assert( query != NULL );
        BER_BVZERO( query );
 
        bsi->bsi_use_subtree_shortcut = 0;
@@ -1289,14 +1284,8 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
                                &bsi->bsi_oc->bom_oc->soc_cname,
                                '\'' );
        }
-       backsql_strfcat( &bsi->bsi_sel, "l",
-                       (ber_len_t)STRLENOF( " " BACKSQL_ALIASING 
-                                       BACKSQL_ALIASING_QUOTE "objectClass" BACKSQL_ALIASING_QUOTE 
-                                       ",ldap_entries.dn " BACKSQL_ALIASING BACKSQL_ALIASING_QUOTE "dn" BACKSQL_ALIASING_QUOTE ),
-                               " " BACKSQL_ALIASING 
-                                       BACKSQL_ALIASING_QUOTE "objectClass" BACKSQL_ALIASING_QUOTE
-                                       ",ldap_entries.dn " BACKSQL_ALIASING BACKSQL_ALIASING_QUOTE "dn" BACKSQL_ALIASING_QUOTE );
 
+       backsql_strfcat( &bsi->bsi_sel, "b", &bi->sql_dn_oc_aliasing );
        backsql_strfcat( &bsi->bsi_from, "lb",
                        (ber_len_t)STRLENOF( " FROM ldap_entries," ),
                                " FROM ldap_entries,",
@@ -1351,7 +1340,7 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
                        int             i;
                        BackendDB       *bd = bsi->bsi_op->o_bd;
 
-                       assert( bd->be_nsuffix );
+                       assert( bd->be_nsuffix != NULL );
 
                        for ( i = 0; !BER_BVISNULL( &bd->be_nsuffix[ i ] ); i++ )
                        {
@@ -1464,6 +1453,12 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
        Debug( LDAP_DEBUG_TRACE, "==>backsql_oc_get_candidates(): oc=\"%s\"\n",
                        BACKSQL_OC_NAME( oc ), 0, 0 );
 
+       /* check for abandon */
+       if ( op->o_abandon ) {
+               bsi->bsi_status = SLAPD_ABANDON;
+               return BACKSQL_AVL_STOP;
+       }
+
        if ( bsi->bsi_n_candidates == -1 ) {
                Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
                        "unchecked limit has been overcome\n", 0, 0, 0 );
@@ -1696,7 +1691,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
                return BACKSQL_AVL_CONTINUE;
        }
 
-       backsql_BindRowAsStrings( sth, &row );
+       backsql_BindRowAsStrings_x( sth, &row, bsi->bsi_op->o_tmpmemctx );
        rc = SQLFetch( sth );
        for ( ; BACKSQL_SUCCESS( rc ); rc = SQLFetch( sth ) ) {
                struct berval           dn, pdn, ndn;
@@ -1762,7 +1757,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
                        break;
                }
        }
-       backsql_FreeRow( &row );
+       backsql_FreeRow_x( &row, bsi->bsi_op->o_tmpmemctx );
        SQLFreeStmt( sth, SQL_DROP );
 
        Debug( LDAP_DEBUG_TRACE, "<==backsql_oc_get_candidates(): %d\n",
@@ -1828,7 +1823,6 @@ backsql_search( Operation *op, SlapReply *rs )
        bsi.bsi_e = &base_entry;
        rs->sr_err = backsql_init_search( &bsi, &op->o_req_ndn,
                        op->ors_scope,
-                       op->ors_slimit, op->ors_tlimit,
                        stoptime, op->ors_filter,
                        dbh, op, rs, op->ors_attrs,
                        ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
@@ -1849,6 +1843,10 @@ backsql_search( Operation *op, SlapReply *rs )
                        }
                        break;
                }
+
+               /* an entry was created; free it */
+               entry_clean( bsi.bsi_e );
+
                /* fall thru */
 
        default:
@@ -1869,8 +1867,13 @@ backsql_search( Operation *op, SlapReply *rs )
 #endif /* SLAP_ACL_HONOR_DISCLOSE */
 
                send_ldap_result( op, rs );
-               goto done;
 
+               if ( rs->sr_ref ) {
+                       ber_bvarray_free( rs->sr_ref );
+                       rs->sr_ref = NULL;
+               }
+
+               goto done;
        }
 #ifdef SLAP_ACL_HONOR_DISCLOSE
        /* NOTE: __NEW__ "search" access is required
@@ -1943,6 +1946,13 @@ backsql_search( Operation *op, SlapReply *rs )
                 */
                avl_apply( bi->sql_oc_by_oc, backsql_oc_get_candidates,
                                &bsi, BACKSQL_AVL_STOP, AVL_INORDER );
+
+               /* check for abandon */
+               if ( op->o_abandon ) {
+                       eid = bsi.bsi_id_list;
+                       rs->sr_err = SLAPD_ABANDON;
+                       goto send_results;
+               }
        }
 
        if ( op->ors_limit != NULL      /* isroot == FALSE */
@@ -1973,7 +1983,8 @@ backsql_search( Operation *op, SlapReply *rs )
 
                /* check for abandon */
                if ( op->o_abandon ) {
-                       break;
+                       rs->sr_err = SLAPD_ABANDON;
+                       goto send_results;
                }
 
                /* check time limit */
@@ -2072,7 +2083,6 @@ backsql_search( Operation *op, SlapReply *rs )
                                rc = backsql_init_search( &bsi2,
                                                &e->e_nname,
                                                LDAP_SCOPE_BASE, 
-                                               SLAP_NO_LIMIT, SLAP_NO_LIMIT,
                                                (time_t)(-1), NULL,
                                                dbh, op, rs, NULL,
                                                BACKSQL_ISF_GET_ENTRY );
@@ -2084,7 +2094,7 @@ backsql_search( Operation *op, SlapReply *rs )
                                        } else {
                                                rs->sr_err = LDAP_OTHER;
                                        }
-                                       entry_clean( &user_entry2 );
+                                       backsql_entry_clean( op, &user_entry2 );
                                }
                                if ( bsi2.bsi_attrs != NULL ) {
                                        op->o_tmpfree( bsi2.bsi_attrs,
@@ -2125,7 +2135,7 @@ backsql_search( Operation *op, SlapReply *rs )
                 * filter_has_subordinates()
                 */
                if ( bsi.bsi_flags & BSQL_SF_FILTER_HASSUBORDINATE ) {
-                       rc = backsql_has_children( bi, dbh, &e->e_nname );
+                       rc = backsql_has_children( op, dbh, &e->e_nname );
 
                        switch ( rc ) {
                        case LDAP_COMPARE_TRUE:
@@ -2206,13 +2216,11 @@ backsql_search( Operation *op, SlapReply *rs )
 
 next_entry:;
                if ( e == &user_entry ) {
-                       entry_clean( &user_entry );
+                       backsql_entry_clean( op, &user_entry );
                }
 
 next_entry2:;
-               if ( op->ors_slimit != SLAP_NO_LIMIT
-                               && rs->sr_nentries >= op->ors_slimit )
-               {
+               if ( --op->ors_slimit == -1 ) {
                        rs->sr_err = LDAP_SIZELIMIT_EXCEEDED;
                        goto send_results;
                }
@@ -2229,12 +2237,20 @@ end_of_search:;
        }
 
 send_results:;
-       send_ldap_result( op, rs );
+       if ( rs->sr_err != SLAPD_ABANDON ) {
+               send_ldap_result( op, rs );
+       }
+
+       /* cleanup in case of abandon */
+       for ( ; eid != NULL; 
+                       eid = backsql_free_entryID( op,
+                               eid, eid == &bsi.bsi_base_id ? 0 : 1 ) )
+               ;
 
-       entry_clean( &base_entry );
+       backsql_entry_clean( op, &base_entry );
 
        /* in case we got here accidentally */
-       entry_clean( &user_entry );
+       backsql_entry_clean( op, &user_entry );
 
        if ( rs->sr_v2ref ) {
                ber_bvarray_free( rs->sr_v2ref );
@@ -2282,7 +2298,8 @@ done:;
        }
 
        Debug( LDAP_DEBUG_TRACE, "<==backsql_search()\n", 0, 0, 0 );
-       return 0;
+
+       return rs->sr_err;
 }
 
 /* return LDAP_SUCCESS IFF we can retrieve the specified entry.
@@ -2319,7 +2336,6 @@ backsql_entry_get(
        rc = backsql_init_search( &bsi,
                        ndn,
                        LDAP_SCOPE_BASE, 
-                       SLAP_NO_LIMIT, SLAP_NO_LIMIT,
                        (time_t)(-1), NULL,
                        dbh, op, &rs, at ? anlist : NULL,
                        BACKSQL_ISF_GET_ENTRY );
@@ -2375,3 +2391,39 @@ return_results:;
        return rc;
 }
 
+void
+backsql_entry_clean(
+               Operation       *op,
+               Entry           *e )
+{
+       void *ctx;
+
+       ctx = ldap_pvt_thread_pool_context();
+
+       if ( ctx == NULL || ctx != op->o_tmpmemctx ) {
+               if ( !BER_BVISNULL( &e->e_name ) ) {
+                       op->o_tmpfree( e->e_name.bv_val, op->o_tmpmemctx );
+                       BER_BVZERO( &e->e_name );
+               }
+
+               if ( !BER_BVISNULL( &e->e_nname ) ) {
+                       op->o_tmpfree( e->e_nname.bv_val, op->o_tmpmemctx );
+                       BER_BVZERO( &e->e_nname );
+               }
+       }
+
+       entry_clean( e );
+}
+
+int
+backsql_entry_release(
+               Operation       *op,
+               Entry           *e,
+               int             rw )
+{
+       backsql_entry_clean( op, e );
+
+       ch_free( e );
+
+       return 0;
+}