Commit 6994f3d0 authored by Rusty Russell's avatar Rusty Russell

idtree: import fix from SAMBA source

(Imported from b53f8c187de8)

Author: Rusty Russell <rusty@rustorp.com.au>
Date:   Thu Jun 10 13:27:51 2010 -0700

Since idtree assigns sequentially, it rarely reaches high numbers.
But such numbers can be forced with idr_get_new_above(), and that
reveals two bugs:

1) Crash in sub_remove() caused by pa array being too short.
2) Shift by more than 32 in _idr_find(), which is undefined, causing
   the "outside the current tree" optimization to misfire and return NULL.
parent d208258f
...@@ -236,7 +236,7 @@ build_up: ...@@ -236,7 +236,7 @@ build_up:
static int sub_remove(struct idtree *idp, int shift, int id) static int sub_remove(struct idtree *idp, int shift, int id)
{ {
struct idtree_layer *p = idp->top; struct idtree_layer *p = idp->top;
struct idtree_layer **pa[MAX_LEVEL]; struct idtree_layer **pa[1+MAX_LEVEL];
struct idtree_layer ***paa = &pa[0]; struct idtree_layer ***paa = &pa[0];
int n; int n;
...@@ -276,7 +276,8 @@ void *idtree_lookup(const struct idtree *idp, int id) ...@@ -276,7 +276,8 @@ void *idtree_lookup(const struct idtree *idp, int id)
* This tests to see if bits outside the current tree are * This tests to see if bits outside the current tree are
* present. If so, tain't one of ours! * present. If so, tain't one of ours!
*/ */
if ((id & ~(~0 << MAX_ID_SHIFT)) >> (n + IDTREE_BITS)) if (n + IDTREE_BITS < 31 &&
(id & ~(~0 << MAX_ID_SHIFT)) >> (n + IDTREE_BITS))
return NULL; return NULL;
/* Mask off upper bits we don't use for the search. */ /* Mask off upper bits we don't use for the search. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment