diff options
author | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2012-08-13 12:39:49 -0700 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2012-08-22 11:41:26 +0200 |
commit | 7de2f7e03a9ca33ac116710e01c7f05c85df87a9 (patch) | |
tree | 075e1b918d8be5a90437ea6235bfea4a37884a30 | |
parent | 2a18c2c416109344dbc971424b9dc1b37bcbe608 (diff) | |
download | redis-7de2f7e03a9ca33ac116710e01c7f05c85df87a9.tar.gz |
Set p to its new offset before modifying it
-rw-r--r-- | src/ziplist.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/ziplist.c b/src/ziplist.c index 639e4b61e..9bc6d65d7 100644 --- a/src/ziplist.c +++ b/src/ziplist.c @@ -445,12 +445,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) -= totlen; @@ -463,7 +464,7 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig ZIPLIST_TAIL_OFFSET(zl) += nextdiff; /* Move tail to the front of the ziplist */ - memmove(first.p,p-nextdiff,ZIPLIST_BYTES(zl)-(p-zl)-1+nextdiff); + memmove(first.p,p,ZIPLIST_BYTES(zl)-(p-zl)-1); } else { /* The entire tail was deleted. No need to move memory. */ ZIPLIST_TAIL_OFFSET(zl) = (first.p-zl)-first.prevrawlen; |