Skip to content

Commit

Permalink
More OOM checks in the protocol reader
Browse files Browse the repository at this point in the history
  • Loading branch information
pietern committed Apr 21, 2011
1 parent ac9fb49 commit d4ebb60
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 3 deletions.
26 changes: 24 additions & 2 deletions hiredis.c
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,11 @@ redisReader *redisReaderCreate(void) {
r->errstr[0] = '\0';
r->fn = &defaultFunctions;
r->buf = sdsempty();
if (r->buf == NULL) {
free(r);
return NULL;
}

r->ridx = -1;
return r;
}
Expand All @@ -551,19 +556,36 @@ void redisReaderFree(redisReader *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. */
if (buf != NULL && len >= 1) {
/* Destroy internal buffer when it is empty and is quite large. */
if (r->len == 0 && sdsavail(r->buf) > 16*1024) {
sdsfree(r->buf);
r->buf = sdsempty();
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);
}

return REDIS_OK;
}

int redisReaderGetReply(redisReader *r, void **reply) {
Expand Down
2 changes: 1 addition & 1 deletion hiredis.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ typedef struct redisReader {
/* Public API for the protocol parser. */
redisReader *redisReaderCreate(void);
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);

/* Backwards compatibility, can be removed on big version bump. */
Expand Down

0 comments on commit d4ebb60

Please sign in to comment.