ITS#7030 fix overlay_insert() with specific index

This commit is contained in:
Howard Chu 2011-08-25 20:51:30 -07:00
parent 1c476b302e
commit eae46d35d2

View File

@ -1229,38 +1229,32 @@ overlay_insert( BackendDB *be, slap_overinst *on2, slap_overinst ***prev,
on2->on_next = oi->oi_list; on2->on_next = oi->oi_list;
oi->oi_list = on2; oi->oi_list = on2;
} else { } else {
int i; int i, novs;
slap_overinst *on, *otmp1 = NULL, *otmp2; slap_overinst *on, **prev;
/* Since the list is in reverse order and is singly linked, /* Since the list is in reverse order and is singly linked,
* we reverse it to find the idx insertion point. Adding * we have to count the overlays and then insert backwards.
* on overlay at a specific point should be a pretty * Adding on overlay at a specific point should be a pretty
* infrequent occurrence. * infrequent occurrence.
*/ */
for ( on = oi->oi_list; on; on=otmp2 ) { novs = 0;
otmp2 = on->on_next; for ( on = oi->oi_list; on; on=on->on_next )
on->on_next = otmp1; novs++;
otmp1 = on;
} if (idx > novs)
oi->oi_list = NULL; idx = 0;
else
idx = novs - idx;
/* advance to insertion point */ /* advance to insertion point */
for ( i=0, on = otmp1; i<idx; i++ ) { prev = &oi->oi_list;
otmp1 = on->on_next; for ( i=0; i<idx; i++ ) {
on->on_next = oi->oi_list; on = *prev;
oi->oi_list = on; prev = &on->on_next;
} }
/* insert */ /* insert */
on2->on_next = oi->oi_list; on2->on_next = *prev;
oi->oi_list = on2; *prev = 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;
}
}
} }
} }