fix unreported overflow in autogerenared stream IDs

This commit is contained in:
Loris Cro 2019-11-04 16:36:06 +01:00
parent 3f14bfd809
commit b12d2f65d6
2 changed files with 19 additions and 10 deletions

View File

@ -173,9 +173,19 @@ int streamCompareID(streamID *a, streamID *b) {
* C_ERR if an ID was given via 'use_id', but adding it failed since the * C_ERR if an ID was given via 'use_id', but adding it failed since the
* current top ID is greater or equal. */ * current top ID is greater or equal. */
int streamAppendItem(stream *s, robj **argv, int64_t numfields, streamID *added_id, streamID *use_id) { int streamAppendItem(stream *s, robj **argv, int64_t numfields, streamID *added_id, streamID *use_id) {
/* If an ID was given, check that it's greater than the last entry ID
* or return an error. */ /* Generate the new entry ID. */
if (use_id && streamCompareID(use_id,&s->last_id) <= 0) return C_ERR; streamID id;
if (use_id)
id = *use_id;
else
streamNextID(&s->last_id,&id);
/* Check that the new ID is greater than the last entry ID
* or return an error. Automatically generated IDs might
* overflow (and wrap-around) when incrementing the sequence
part. */
if (streamCompareID(&id,&s->last_id) <= 0) return C_ERR;
/* Add the new entry. */ /* Add the new entry. */
raxIterator ri; raxIterator ri;
@ -192,13 +202,6 @@ int streamAppendItem(stream *s, robj **argv, int64_t numfields, streamID *added_
} }
raxStop(&ri); raxStop(&ri);
/* Generate the new entry ID. */
streamID id;
if (use_id)
id = *use_id;
else
streamNextID(&s->last_id,&id);
/* We have to add the key into the radix tree in lexicographic order, /* We have to add the key into the radix tree in lexicographic order,
* to do so we consider the ID as a single 128 bit number written in * to do so we consider the ID as a single 128 bit number written in
* big endian, so that the most significant bytes are the first ones. */ * big endian, so that the most significant bytes are the first ones. */

View File

@ -79,6 +79,12 @@ start_server {
assert {[streamCompareID $id2 $id3] == -1} assert {[streamCompareID $id2 $id3] == -1}
} }
test {XADD IDs correctly report an error when overflowing} {
r DEL mystream
r xadd mystream 18446744073709551615-18446744073709551615 a b
assert_error ERR* {r xadd mystream * c d}
}
test {XADD with MAXLEN option} { test {XADD with MAXLEN option} {
r DEL mystream r DEL mystream
for {set j 0} {$j < 1000} {incr j} { for {set j 0} {$j < 1000} {incr j} {