Skip to content

Commit

Permalink
Set p to its new offset before modifying it
Browse files Browse the repository at this point in the history
  • Loading branch information
pietern committed Aug 13, 2012
1 parent 5117c20 commit 3cc2904
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions src/ziplist.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,12 +500,13 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
totlen = p-first.p;
if (totlen > 0) {
if (p[0] != ZIP_END) {
/* Tricky: storing the prevlen in this entry might reduce or
* increase the number of bytes needed, compared to the current
* prevlen. Note that we can always store this length because
* it was previously stored by an entry that is being deleted. */
/* Storing `prevrawlen` in this entry may increase or decrease the
* number of bytes required compare to the current `prevrawlen`.
* There always is room to store this, because it was previously
* stored by an entry that is now being deleted. */
nextdiff = zipPrevLenByteDiff(p,first.prevrawlen);
zipPrevEncodeLength(p-nextdiff,first.prevrawlen);
p -= nextdiff;
zipPrevEncodeLength(p,first.prevrawlen);

/* Update offset for tail */
ZIPLIST_TAIL_OFFSET(zl) =
Expand All @@ -521,8 +522,8 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
}

/* Move tail to the front of the ziplist */
memmove(first.p,p-nextdiff,
intrev32ifbe(ZIPLIST_BYTES(zl))-(p-zl)-1+nextdiff);
memmove(first.p,p,
intrev32ifbe(ZIPLIST_BYTES(zl))-(p-zl)-1);
} else {
/* The entire tail was deleted. No need to move memory. */
ZIPLIST_TAIL_OFFSET(zl) =
Expand Down

0 comments on commit 3cc2904

Please sign in to comment.