summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2012-08-13 12:39:49 -0700
committerPieter Noordhuis <pcnoordhuis@gmail.com>2012-08-13 14:13:09 -0700
commit3cc2904e3e0d5a3bb3663737a5601f91226fe67c (patch)
tree45815a316449071ecb52384f84f519c825d4893d
parent5117c20ab5558e5d68b1a3c7751610cd6c4279db (diff)
downloadredis-3cc2904e3e0d5a3bb3663737a5601f91226fe67c.tar.gz
Set p to its new offset before modifying it
-rw-r--r--src/ziplist.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/ziplist.c b/src/ziplist.c
index 8ada7c421..23bad45c6 100644
--- a/src/ziplist.c
+++ b/src/ziplist.c
@@ -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) =
@@ -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) =