Skip to content

Commit

Permalink
Auto merge of redis#468 - paul-scott:master, r=badboy
Browse files Browse the repository at this point in the history
Prevented uv adapter from calling write when context has been freed

The `redisLibuvPoll` function can be called with both the `UV_READABLE` and `UV_WRITABLE` flags set at the same time.  Calling `redisAsyncHandleRead` can lead to a disconnect and the context being cleaned up/freed.  If this happens then `redisAsyncHandleWrite` should not be called otherwise memory read/write errors and duplicate freeing will occur.

These changes prevent this from happening by having the `redisLibuvCleanup` callback indicate that the context has been cleaned.  This is done indirectly by setting the context to a null pointer, maybe someone can come up with a cleaner way.
  • Loading branch information
not-a-robot authored Dec 9, 2016
2 parents 8636d90 + cbb9565 commit b4f9fc1
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions adapters/libuv.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ static void redisLibuvPoll(uv_poll_t* handle, int status, int events) {
return;
}

if (events & UV_READABLE) {
if (p->context != NULL && (events & UV_READABLE)) {
redisAsyncHandleRead(p->context);
}
if (events & UV_WRITABLE) {
if (p->context != NULL && (events & UV_WRITABLE)) {
redisAsyncHandleWrite(p->context);
}
}
Expand Down Expand Up @@ -83,6 +83,7 @@ static void on_close(uv_handle_t* handle) {
static void redisLibuvCleanup(void *privdata) {
redisLibuvEvents* p = (redisLibuvEvents*)privdata;

p->context = NULL; // indicate that context might no longer exist
uv_close((uv_handle_t*)&p->handle, on_close);
}

Expand Down

0 comments on commit b4f9fc1

Please sign in to comment.