> you are missing my point. My point is that when a hashtable > contains these two elements > > example: > > BUCKET_ENTRY for h=15 > --- Bucket1 : key == numeric -> h= numeric hash value == 15 > \-------- Bucket2: key == some string key, with a hash > value equal to 15 > > Lets assume we want to delete the key > "THI_HASH_A_HASH_FUNCTION_VALUE_OF_15" > then the code in question will first hash it and gets h==15. > The next thing it will do is go through the linked list of > buckets for h==15. > Unfortunately the check there is broken. It will first check, > that p->h is == 15 and then check if p->nKeyLength==0 which > obviously is for our Bucket1. Unfortunately this is already > enough to evaluate to true. But it is not what we intended. > We wanted to delete bucket2. > But we end up with Bucket1 deleted. > /* original */ if ((p->h == h) && ((p->nKeyLength == 0) || /* Numeric index */ ((p->nKeyLength == nKeyLength) && (!memcmp(p->arKey, arKey, nKeyLength))))) { Vs. /* rearranged */ if ((p->h == h) && (p->nKeyLength == nKeyLength) && ((nKeyLength == 0) || (!memcmp(p->arKey, arKey, nKeyLength))))
Jared -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php