From d71b98650f64b09cdc4d028144617cad4af00e1b Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Mon, 31 May 2010 23:35:21 +0200 Subject: [PATCH] ziplistNext should work as expected when called with a pointer to ZIP_END --- ziplist.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ziplist.c b/ziplist.c index 8b96d6d72..433032e69 100644 --- a/ziplist.c +++ b/ziplist.c @@ -430,7 +430,16 @@ unsigned char *ziplistIndex(unsigned char *zl, int index) { /* Return pointer to next entry in ziplist. */ unsigned char *ziplistNext(unsigned char *zl, unsigned char *p) { ((void) zl); - return (p[0] == ZIP_END) ? NULL : p+zipRawEntryLength(p); + + /* "p" could be equal to ZIP_END, caused by ziplistDelete, + * and we should return NULL. Otherwise, we should return NULL + * when the *next* element is ZIP_END (there is no next entry). */ + if (p[0] == ZIP_END) { + return NULL; + } else { + p = p+zipRawEntryLength(p); + return (p[0] == ZIP_END) ? NULL : p; + } } /* Return pointer to previous entry in ziplist. */ -- GitLab