diff options
Diffstat (limited to 'src/t_list.c')
-rw-r--r-- | src/t_list.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/t_list.c b/src/t_list.c index de417f470..67541554f 100644 --- a/src/t_list.c +++ b/src/t_list.c @@ -29,6 +29,8 @@ #include "server.h" +#define LIST_MAX_ITEM_SIZE ((1ull<<32)-1024) + /*----------------------------------------------------------------------------- * List API *----------------------------------------------------------------------------*/ @@ -196,6 +198,14 @@ void listTypeConvert(robj *subject, int enc) { void pushGenericCommand(client *c, int where) { int j, pushed = 0; + + for (j = 2; j < c->argc; j++) { + if (sdslen(c->argv[j]->ptr) > LIST_MAX_ITEM_SIZE) { + addReplyError(c, "Element too large"); + return; + } + } + robj *lobj = lookupKeyWrite(c->db,c->argv[1]); if (lobj && lobj->type != OBJ_LIST) { @@ -277,6 +287,11 @@ void linsertCommand(client *c) { return; } + if (sdslen(c->argv[4]->ptr) > LIST_MAX_ITEM_SIZE) { + addReplyError(c, "Element too large"); + return; + } + if ((subject = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL || checkType(c,subject,OBJ_LIST)) return; @@ -344,6 +359,11 @@ void lsetCommand(client *c) { long index; robj *value = c->argv[3]; + if (sdslen(value->ptr) > LIST_MAX_ITEM_SIZE) { + addReplyError(c, "Element too large"); + return; + } + if ((getLongFromObjectOrReply(c, c->argv[2], &index, NULL) != C_OK)) return; @@ -493,6 +513,11 @@ void lremCommand(client *c) { long toremove; long removed = 0; + if (sdslen(obj->ptr) > LIST_MAX_ITEM_SIZE) { + addReplyError(c, "Element too large"); + return; + } + if ((getLongFromObjectOrReply(c, c->argv[2], &toremove, NULL) != C_OK)) return; |