More OOM checks in the protocol reader

This commit is contained in:
Pieter Noordhuis 2011-04-21 18:50:10 +02:00
parent ac9fb4993b
commit d4ebb60d65
2 changed files with 25 additions and 3 deletions

View File

@ -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) {
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) {
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) {

View File

@ -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. */