Browse Source

idtree: fix right shift of signed ints

(Imported from SAMBA commit 2db1987f5a3a)

Right-shifting signed integers in undefined; indeed it seems that on
AIX with their compiler, doing a 30-bit shift on (INT_MAX-200) gives
0, not 1 as we might expect (THIS WAS WRONG, REAL FIX LATER).

The obvious fix is to make id and oid unsigned: l (level count) is also
logically unsigned.

(Note: Samba doesn't generally get to ids > 1 billion, but ctdb does)

Reported-by: Chris Cowan <cc@us.ibm.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 15 years ago
parent
commit
9ad912e258
1 changed files with 1 additions and 1 deletions
  1. 1 1
      ccan/idtree/idtree.c

+ 1 - 1
ccan/idtree/idtree.c

@@ -100,7 +100,7 @@ static int sub_alloc(struct idtree *idp, const void *ptr, int *starting_id)
 	int n, m, sh;
 	struct idtree_layer *p, *pn;
 	struct idtree_layer *pa[MAX_LEVEL];
-	int l, id, oid;
+	unsigned int l, id, oid;
 	uint32_t bm;
 
 	memset(pa, 0, sizeof(pa));