You need to sign in or sign up before continuing.
Commit d4ebb60d authored by Pieter Noordhuis's avatar Pieter Noordhuis
Browse files

More OOM checks in the protocol reader

parent ac9fb499
...@@ -539,6 +539,11 @@ redisReader *redisReaderCreate(void) { ...@@ -539,6 +539,11 @@ redisReader *redisReaderCreate(void) {
r->errstr[0] = '\0'; r->errstr[0] = '\0';
r->fn = &defaultFunctions; r->fn = &defaultFunctions;
r->buf = sdsempty(); r->buf = sdsempty();
if (r->buf == NULL) {
free(r);
return NULL;
}
r->ridx = -1; r->ridx = -1;
return r; return r;
} }
...@@ -551,7 +556,13 @@ void redisReaderFree(redisReader *r) { ...@@ -551,7 +556,13 @@ void redisReaderFree(redisReader *r) {
free(r); free(r);
} }
void redisReaderFeed(redisReader *r, const char *buf, size_t len) { int redisReaderFeed(redisReader *r, const char *buf, size_t len) {
sds newbuf;
/* Return early when this reader is in an erroneous state. */
if (r->err)
return REDIS_ERR;
/* Copy the provided buffer. */ /* Copy the provided buffer. */
if (buf != NULL && len >= 1) { if (buf != NULL && len >= 1) {
/* Destroy internal buffer when it is empty and is quite large. */ /* Destroy internal buffer when it is empty and is quite large. */
...@@ -559,11 +570,22 @@ void redisReaderFeed(redisReader *r, const char *buf, size_t len) { ...@@ -559,11 +570,22 @@ void redisReaderFeed(redisReader *r, const char *buf, size_t len) {
sdsfree(r->buf); sdsfree(r->buf);
r->buf = sdsempty(); r->buf = sdsempty();
r->pos = 0; r->pos = 0;
/* r->buf should not be NULL since we just free'd a larger one. */
assert(r->buf != NULL);
} }
r->buf = sdscatlen(r->buf,buf,len); newbuf = sdscatlen(r->buf,buf,len);
if (newbuf == NULL) {
__redisReaderSetErrorOOM(r);
return REDIS_ERR;
}
r->buf = newbuf;
r->len = sdslen(r->buf); r->len = sdslen(r->buf);
} }
return REDIS_OK;
} }
int redisReaderGetReply(redisReader *r, void **reply) { int redisReaderGetReply(redisReader *r, void **reply) {
......
...@@ -134,7 +134,7 @@ typedef struct redisReader { ...@@ -134,7 +134,7 @@ typedef struct redisReader {
/* Public API for the protocol parser. */ /* Public API for the protocol parser. */
redisReader *redisReaderCreate(void); redisReader *redisReaderCreate(void);
void redisReaderFree(redisReader *r); void redisReaderFree(redisReader *r);
void redisReaderFeed(redisReader *r, const char *buf, size_t len); int redisReaderFeed(redisReader *r, const char *buf, size_t len);
int redisReaderGetReply(redisReader *r, void **reply); int redisReaderGetReply(redisReader *r, void **reply);
/* Backwards compatibility, can be removed on big version bump. */ /* Backwards compatibility, can be removed on big version bump. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment