fix compare function of ziplist to only load integer from ziplist when it is encoded as integer

This commit is contained in:
Pieter Noordhuis 2010-05-22 21:49:36 +02:00
parent 6205b46387
commit c4aace9003

View File

@ -374,18 +374,23 @@ unsigned int ziplistCompare(unsigned char *p, unsigned char *entry, unsigned int
if (*p == ZIP_END) return 0; if (*p == ZIP_END) return 0;
zlen = zipDecodeLength(p,&lensize); zlen = zipDecodeLength(p,&lensize);
if (zipTryEncoding(entry,&eval,&encoding)) { if (ZIP_ENCODING(p) == ZIP_ENC_RAW) {
/* Do integer compare */
zval = zipLoadInteger(p+lensize,ZIP_ENCODING(p));
return zval == eval;
} else {
/* Raw compare */ /* Raw compare */
if (zlen == elen) { if (zlen == elen) {
return memcmp(p+lensize,entry,elen) == 0; return memcmp(p+lensize,entry,elen) == 0;
} else { } else {
return 0; return 0;
} }
} else {
if (zipTryEncoding(entry,&eval,&encoding)) {
/* Do integer compare */
zval = zipLoadInteger(p+lensize,ZIP_ENCODING(p));
return zval == eval;
} else {
/* Ziplist entry is integer encoded, but given entry is not. */
}
} }
return 0;
} }
/* Return length of ziplist. */ /* Return length of ziplist. */