]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fixed get_height to ensure that SK_MAXHEIGHT-1 is the maximum level we
authorTom Hughes <tom@compton.nu>
Thu, 28 Oct 2004 08:09:53 +0000 (08:09 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 28 Oct 2004 08:09:53 +0000 (08:09 +0000)
will allocate for a skip list entry as many routines use arrays of
size SK_MAXHEIGHT to hold a set of level pointers which means that a
level of SK_MAXHEIGHT is not valid due to C arrays being zero based.

This led to a number of subtle and hard to locate problems caused by
stack based arrays being overflowed by one entry when a node was
allocated with the maximum level. As each node only has a one in two
million or so chance of getting a level of SK_MAXHEIGHT this didn't
actually happen all that often.

MERGED FROM HEAD

git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_2_2_0_BRANCH@2863

coregrind/vg_skiplist.c

index fac7b7c0afad6e21d03fe1d305269e686355d39c..d5894cab62b7bde11c7f876bf7efd3c18c0fec06 100644 (file)
@@ -112,7 +112,7 @@ static inline Int get_height(void)
 {
    UInt ret = 0;
 
-   while((ret < SK_MAXHEIGHT) && (random() & 1))
+   while((ret < SK_MAXHEIGHT - 1) && (random() & 1))
       ret++;
 
    return ret;