]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/idl.c
More places where LOCK_ID() calls need to be checked.
[openldap] / servers / slapd / back-ldbm / idl.c
index e3a5238ec66aa112cc2357130fe26a0cca21e8b2..a070f46adf399002cb42b59d386bad7cc9bb4f01 100644 (file)
@@ -31,7 +31,7 @@ static void cont_alloc( Datum *cont, Datum *key )
 
 static void cont_id( Datum *cont, ID id )
 {
-       int i;
+       unsigned int i;
 
        for( i=1; i <= sizeof(id); i++) {
                ((unsigned char *)cont->dptr)[i] = (unsigned char)(id & 0xFF);
@@ -104,8 +104,7 @@ idl_free( ID_BLOCK *idl )
 {
        if ( idl == NULL ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
-                          "idl_free: called with NULL pointer\n" ));
+               LDAP_LOG( INDEX, INFO, "idl_free: called with NULL pointer\n" , 0,0,0);
 #else
                Debug( LDAP_DEBUG_TRACE,
                        "idl_free: called with NULL pointer\n",
@@ -138,7 +137,13 @@ idl_fetch_one(
                return NULL;
        }
 
-       idl = idl_dup((ID_BLOCK *) data.dptr);
+       idl = (ID_BLOCK *) data.dptr;
+       if ( ID_BLOCK_ALLIDS(idl) ) {
+               /* make sure we have the current value of highest id */
+               idl = idl_allids( be );
+       } else {
+               idl = idl_dup((ID_BLOCK *) data.dptr);
+       }
 
        ldbm_datum_free( db->dbc_db, data );
 
@@ -176,10 +181,6 @@ idl_fetch(
 
        if ( ID_BLOCK_ALLIDS(idl) ) {
                /* all ids block */
-               /* make sure we have the current value of highest id */
-               idl_free( idl );
-               idl = idl_allids( be );
-
                return( idl );
        }
 
@@ -215,8 +216,8 @@ idl_fetch(
 
                if ( (tmp[i] = idl_fetch_one( be, db, data )) == NULL ) {
 #ifdef NEW_LOGGING
-                       LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
-                                  "idl_fetch: idl_fetch_one returned NULL\n" ));
+                       LDAP_LOG( INDEX, INFO,
+                                  "idl_fetch: idl_fetch_one returned NULL\n", 0,0,0 );
 #else
                        Debug( LDAP_DEBUG_ANY,
                            "idl_fetch: one returned NULL\n", 0, 0, 0 );
@@ -257,9 +258,9 @@ idl_fetch(
 #endif
 
 #ifdef NEW_LOGGING
-       LDAP_LOG(( "cache", LDAP_LEVEL_ENTRY,
+       LDAP_LOG( INDEX, ENTRY, 
                   "idl_fetch: %ld ids (%ld max)\n",
-                  ID_BLOCK_NIDS(idl), ID_BLOCK_NMAXN(idl) ));
+                  ID_BLOCK_NIDS(idl), ID_BLOCK_NMAXN(idl), 0 );
 #else
        Debug( LDAP_DEBUG_TRACE, "<= idl_fetch %ld ids (%ld max)\n",
               ID_BLOCK_NIDS(idl), ID_BLOCK_NMAXN(idl), 0 );
@@ -406,8 +407,8 @@ idl_change_first(
        /* delete old key block */
        if ( (rc = ldbm_cache_delete( db, bkey )) != 0 ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
-                          "idl_change_first: ldbm_cache_delete returned %d\n", rc ));
+               LDAP_LOG( INDEX, INFO, 
+                          "idl_change_first: ldbm_cache_delete returned %d\n", rc, 0, 0 );
 #else
                Debug( LDAP_DEBUG_ANY,
                    "idl_change_first: ldbm_cache_delete returned %d\n",
@@ -422,8 +423,8 @@ idl_change_first(
 
        if ( (rc = idl_store( be, db, bkey, b )) != 0 ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
-                          "idl_change_first: idl_store returned %d\n", rc ));
+               LDAP_LOG( INDEX, INFO, 
+                          "idl_change_first: idl_store returned %d\n", rc, 0, 0 );
 #else
                Debug( LDAP_DEBUG_ANY,
                    "idl_change_first: idl_store returned %d\n", rc, 0, 0 );
@@ -436,8 +437,8 @@ idl_change_first(
        ID_BLOCK_ID(h, pos) = ID_BLOCK_ID(b, 0);
        if ( (rc = idl_store( be, db, hkey, h )) != 0 ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
-                          "idl_change_first: idl_store returned %s\n", rc ));
+               LDAP_LOG( INDEX, INFO, 
+                          "idl_change_first: idl_store returned %s\n", rc, 0, 0 );
 #else
                Debug( LDAP_DEBUG_ANY,
                    "idl_change_first: idl_store returned %d\n", rc, 0, 0 );
@@ -502,14 +503,15 @@ idl_insert_key(
                        idl_free( idl );
 
                        /* create the header indirect block */
-                       idl = idl_alloc( 3 );
 #ifndef USE_INDIRECT_NIDS
+                       idl = idl_alloc( 3 );
                        ID_BLOCK_NMAX(idl) = 3;
                        ID_BLOCK_NIDS(idl) = ID_BLOCK_INDIRECT_VALUE;
                        ID_BLOCK_ID(idl, 0) = ID_BLOCK_ID(tmp, 0);
                        ID_BLOCK_ID(idl, 1) = ID_BLOCK_ID(tmp2, 0);
                        ID_BLOCK_ID(idl, 2) = NOID;
 #else
+                       idl = idl_alloc( 2 );
                        ID_BLOCK_NMAX(idl) = 2 | ID_BLOCK_INDIRECT_VALUE;
                        ID_BLOCK_NIDS(idl) = 2;
                        ID_BLOCK_ID(idl, 0) = ID_BLOCK_ID(tmp, 0);
@@ -569,8 +571,8 @@ idl_insert_key(
 
        if ( (tmp = idl_fetch_one( be, db, k2 )) == NULL ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "cache", LDAP_LEVEL_ERR,
-                          "idl_insert_key: nonexistent continuation block\n" ));
+               LDAP_LOG( INDEX, ERR,
+                          "idl_insert_key: nonexistent continuation block\n", 0, 0, 0 );
 #else
                Debug( LDAP_DEBUG_ANY, "idl_insert_key: nonexistent continuation block\n",
                    0, 0, 0 );
@@ -586,8 +588,8 @@ idl_insert_key(
        case 0:         /* id inserted ok */
                if ( (rc = idl_store( be, db, k2, tmp )) != 0 ) {
 #ifdef NEW_LOGGING
-                       LDAP_LOG(( "cache", LDAP_LEVEL_ERR,
-                                  "ids_insert_key: idl_store returned %d\n", rc ));
+                       LDAP_LOG( INDEX, ERR, 
+                                  "ids_insert_key: idl_store returned %d\n", rc, 0, 0 );
 #else
                        Debug( LDAP_DEBUG_ANY,
                            "idl_insert_key: idl_store returned %d\n", rc, 0, 0 );
@@ -629,8 +631,8 @@ idl_insert_key(
                        cont_id( &k2, ID_BLOCK_ID(idl, i) );
                        if ( (tmp2 = idl_fetch_one( be, db, k2 )) == NULL ) {
 #ifdef NEW_LOGGING
-                               LDAP_LOG(( "cache", LDAP_LEVEL_ERR,
-                                          "idl_insert_key: idl_fetch_one returned NULL\n"));
+                               LDAP_LOG( INDEX, ERR,
+                                          "idl_insert_key: idl_fetch_one returned NULL\n", 0, 0, 0);
 #else
                                Debug( LDAP_DEBUG_ANY,
                                    "idl_insert_key: idl_fetch_one returned NULL\n",
@@ -649,9 +651,6 @@ idl_insert_key(
                         */
                        if (id < ID_BLOCK_ID(tmp, ID_BLOCK_NIDS(tmp) - 1)) {
                            ID id2 = ID_BLOCK_ID(tmp, ID_BLOCK_NIDS(tmp) - 1);
-                           Datum k3;
-
-                           ldbm_datum_init( k3 );
 
                            --ID_BLOCK_NIDS(tmp);
                            /* This must succeed since we just popped one
@@ -659,13 +658,10 @@ idl_insert_key(
                             */
                            rc = idl_insert( &tmp, id, db->dbc_maxids );
 
-                               k3.dptr = ch_malloc(k2.dsize);
-                               k3.dsize = k2.dsize;
-                               AC_MEMCPY(k3.dptr, k2.dptr, k3.dsize);
-                           if ( (rc = idl_store( be, db, k3, tmp )) != 0 ) {
+                           if ( (rc = idl_store( be, db, k2, tmp )) != 0 ) {
 #ifdef NEW_LOGGING
-                               LDAP_LOG(( "cache", LDAP_LEVEL_ERR,
-                                              "idl_insert_key: idl_store returned %d\n", rc ));
+                               LDAP_LOG( INDEX, ERR, 
+                                       "idl_insert_key: idl_store returned %d\n", rc, 0, 0 );
 #else
                                Debug( LDAP_DEBUG_ANY,
                            "idl_insert_key: idl_store returned %d\n", rc, 0, 0 );
@@ -673,8 +669,6 @@ idl_insert_key(
 
                            }
 
-                               free( k3.dptr );
-
                            id = id2;
                            /* This new id will necessarily be inserted
                             * as the first id of the next block by the
@@ -697,9 +691,9 @@ idl_insert_key(
                                         */
                                if ( rc == 2 ) {
 #ifdef NEW_LOGGING
-                                       LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
+                                       LDAP_LOG( INDEX, INFO, 
                                                   "idl_insert_key: id %ld is already in next block\n", 
-                                                  id ));
+                                                  id, 0, 0 );
 #else
                                        Debug( LDAP_DEBUG_ANY,
                                            "idl_insert_key: id %ld already in next block\n",
@@ -798,7 +792,7 @@ split:
                        (char *) &ID_BLOCK_ID(tmp, i + 2),
                        (char *) &ID_BLOCK_ID(idl, i + 1),
                        (ID_BLOCK_NIDS(idl) - i - 1) * sizeof(ID) );
-               ID_BLOCK_NIDS(idl)++;
+               ID_BLOCK_NIDS(tmp) = ID_BLOCK_NIDS(idl) + 1;
 #endif
 
                /* store the header block */
@@ -952,8 +946,8 @@ idl_delete_key (
 
                if ( (tmp = idl_fetch_one( be, db, data )) == NULL ) {
 #ifdef NEW_LOGGING
-                       LDAP_LOG(( "cache", LDAP_LEVEL_INFO,
-                                  "idl_delete_key: idl_fetch_one returned NULL\n" ));
+                       LDAP_LOG( INDEX, INFO,
+                                  "idl_delete_key: idl_fetch_one returned NULL\n", 0, 0, 0 );
 #else
                        Debug( LDAP_DEBUG_ANY,
                            "idl_delete_key: idl_fetch of returned NULL\n", 0, 0, 0 );
@@ -1063,6 +1057,9 @@ idl_intersection(
        if ( ID_BLOCK_ALLIDS( b ) ) {
                return( idl_dup( a ) );
        }
+       if ( ID_BLOCK_NIDS(a) == 0 || ID_BLOCK_NIDS(b) == 0 ) {
+               return( NULL );
+       }
 
        n = idl_dup( idl_min( a, b ) );
 
@@ -1071,20 +1068,21 @@ idl_intersection(
        idl_check(b);
 #endif
 
-       for ( ni = 0, ai = 0, bi = 0; ai < ID_BLOCK_NIDS(a); ai++ ) {
-               for ( ;
-                       bi < ID_BLOCK_NIDS(b) && ID_BLOCK_ID(b, bi) < ID_BLOCK_ID(a, ai);
-                       bi++ )
-               {
-                       ;       /* NULL */
-               }
-
-               if ( bi == ID_BLOCK_NIDS(b) ) {
-                       break;
-               }
-
+       for ( ni = 0, ai = 0, bi = 0; ; ) {
                if ( ID_BLOCK_ID(b, bi) == ID_BLOCK_ID(a, ai) ) {
                        ID_BLOCK_ID(n, ni++) = ID_BLOCK_ID(a, ai);
+                       ai++;
+                       bi++;
+                       if ( ai >= ID_BLOCK_NIDS(a) || bi >= ID_BLOCK_NIDS(b) )
+                               break;
+               } else if ( ID_BLOCK_ID(a, ai) < ID_BLOCK_ID(b, bi) ) {
+                       ai++;
+                       if ( ai >= ID_BLOCK_NIDS(a) )
+                               break;
+               } else {
+                       bi++;
+                       if ( bi >= ID_BLOCK_NIDS(b) )
+                               break;
                }
        }