Unix CM: Fix hash table overflow in dnlc code
authorSimon Wilkinson <sxw@your-file-system.com>
Thu, 28 Feb 2013 15:26:15 +0000 (15:26 +0000)
committerJeffrey Altman <jaltman@your-file-system.com>
Fri, 1 Mar 2013 00:21:33 +0000 (16:21 -0800)
In GetMeAnEntry, we can end up overflowing the nameHash array by one
element if the stars are particularly badly aligned.

nameptr is a static across function calls, so nameptr and j are not
equal. If nameptr is increment to NHSIZE in the same loop iteration
as j reaches NHSIZE + 2, the loop will terminate. We'll then
lookup nameHash[NHSIZE], which is 1 element passed the end of the
array.

Add an if statement which loops nameptr outside the loop (in the
same way as the if statement in the loop)

Caught by coverity (#985568)

Change-Id: I47075f363fad10e8c19276359699566755779cca
Reviewed-on: http://gerrit.openafs.org/9312
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/afs/afs_osidnlc.c

index 1ba66ae..d8e4f08 100644 (file)
@@ -81,6 +81,9 @@ GetMeAnEntry(void)
            break;
     }
 
+    if (nameptr >= NHSIZE);
+       nameptr = 0;
+
     TRACE(ScavengeEntryT, nameptr);
     tnc = nameHash[nameptr];
     if (!tnc)                  /* May want to consider changing this to return 0 */