Set p to its new offset before modifying it

This commit is contained in:
Pieter Noordhuis 2012-08-13 12:39:49 -07:00
parent 5117c20ab5
commit 3cc2904e3e

View File

@ -500,12 +500,13 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
totlen = p-first.p; totlen = p-first.p;
if (totlen > 0) { if (totlen > 0) {
if (p[0] != ZIP_END) { if (p[0] != ZIP_END) {
/* Tricky: storing the prevlen in this entry might reduce or /* Storing `prevrawlen` in this entry may increase or decrease the
* increase the number of bytes needed, compared to the current * number of bytes required compare to the current `prevrawlen`.
* prevlen. Note that we can always store this length because * There always is room to store this, because it was previously
* it was previously stored by an entry that is being deleted. */ * stored by an entry that is now being deleted. */
nextdiff = zipPrevLenByteDiff(p,first.prevrawlen); nextdiff = zipPrevLenByteDiff(p,first.prevrawlen);
zipPrevEncodeLength(p-nextdiff,first.prevrawlen); p -= nextdiff;
zipPrevEncodeLength(p,first.prevrawlen);
/* Update offset for tail */ /* Update offset for tail */
ZIPLIST_TAIL_OFFSET(zl) = ZIPLIST_TAIL_OFFSET(zl) =
@ -521,8 +522,8 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
} }
/* Move tail to the front of the ziplist */ /* Move tail to the front of the ziplist */
memmove(first.p,p-nextdiff, memmove(first.p,p,
intrev32ifbe(ZIPLIST_BYTES(zl))-(p-zl)-1+nextdiff); intrev32ifbe(ZIPLIST_BYTES(zl))-(p-zl)-1);
} else { } else {
/* The entire tail was deleted. No need to move memory. */ /* The entire tail was deleted. No need to move memory. */
ZIPLIST_TAIL_OFFSET(zl) = ZIPLIST_TAIL_OFFSET(zl) =