]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backover.c
silence warning
[openldap] / servers / slapd / backover.c
index f04171640ea89a787a5077fd6f3225e1771f03bc..d8707420f62e9e27f3ff24a59806205ba1c440bc 100644 (file)
@@ -474,15 +474,16 @@ over_acl_group(
 {
        slap_overinfo *oi;
        slap_overinst *on;
-       BackendInfo *bi = op->o_bd->bd_info;
+       BackendInfo *bi;
        BackendDB *be = op->o_bd, db;
        int rc = SLAP_CB_CONTINUE;
 
        /* FIXME: used to happen for instance during abandon
         * when global overlays are used... */
-       assert( op->o_bd != NULL );
+       assert( be != NULL );
 
-       oi = op->o_bd->bd_info->bi_private;
+       bi = be->bd_info;
+       oi = bi->bi_private;
        on = oi->oi_list;
 
        for ( ; on; on = on->on_next ) {
@@ -542,15 +543,16 @@ over_acl_attribute(
 {
        slap_overinfo *oi;
        slap_overinst *on;
-       BackendInfo *bi = op->o_bd->bd_info;
+       BackendInfo *bi;
        BackendDB *be = op->o_bd, db;
        int rc = SLAP_CB_CONTINUE;
 
        /* FIXME: used to happen for instance during abandon
         * when global overlays are used... */
-       assert( op->o_bd != NULL );
+       assert( be != NULL );
 
-       oi = op->o_bd->bd_info->bi_private;
+       bi = be->bd_info;
+       oi = bi->bi_private;
        on = oi->oi_list;
 
        for ( ; on; on = on->on_next ) {
@@ -1227,38 +1229,32 @@ overlay_insert( BackendDB *be, slap_overinst *on2, slap_overinst ***prev,
                on2->on_next = oi->oi_list;
                oi->oi_list = on2;
        } else {
-               int i;
-               slap_overinst *on, *otmp1 = NULL, *otmp2;
+               int i, novs;
+               slap_overinst *on, **prev;
 
                /* Since the list is in reverse order and is singly linked,
-                * we reverse it to find the idx insertion point. Adding
-                * on overlay at a specific point should be a pretty
+                * we have to count the overlays and then insert backwards.
+                * Adding on overlay at a specific point should be a pretty
                 * infrequent occurrence.
                 */
-               for ( on = oi->oi_list; on; on=otmp2 ) {
-                       otmp2 = on->on_next;
-                       on->on_next = otmp1;
-                       otmp1 = on;
-               }
-               oi->oi_list = NULL;
+               novs = 0;
+               for ( on = oi->oi_list; on; on=on->on_next )
+                       novs++;
+
+               if (idx > novs)
+                       idx = 0;
+               else
+                       idx = novs - idx;
+
                /* advance to insertion point */
-               for ( i=0, on = otmp1; i<idx; i++ ) {
-                       otmp1 = on->on_next;
-                       on->on_next = oi->oi_list;
-                       oi->oi_list = on;
+               prev = &oi->oi_list;
+               for ( i=0; i<idx; i++ ) {
+                       on = *prev;
+                       prev = &on->on_next;
                }
                /* insert */
-               on2->on_next = oi->oi_list;
-               oi->oi_list = on2;
-               if ( otmp1 ) {
-                       *prev = &otmp1->on_next;
-                       /* replace remainder of list */
-                       for ( on=otmp1; on; on=otmp1 ) {
-                               otmp1 = on->on_next;
-                               on->on_next = oi->oi_list;
-                               oi->oi_list = on;
-                       }
-               }
+               on2->on_next = *prev;
+               *prev = on2;
        }
 }