Skip to content

Commit

Permalink
Set error when invalid timeout value is given to redisConnectWithTimeout
Browse files Browse the repository at this point in the history
Closes redis#154

This commit properly sets the error value inside of
redisContextWaitReady when an invalid sec or usec value is provided.
Tests for each case are provided to demonstrate that the issue is
properly fixed and to avoid regression.

Signed-off-by: Aaron Bedra <[email protected]>
  • Loading branch information
abedra committed Mar 15, 2013
1 parent fd38e55 commit fca66b9
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
1 change: 1 addition & 0 deletions net.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ static int redisContextWaitReady(redisContext *c, int fd, const struct timeval *
/* Only use timeout when not NULL. */
if (timeout != NULL) {
if (timeout->tv_usec > 1000000 || timeout->tv_sec > __MAX_MSEC) {
__redisSetErrorFromErrno(c, REDIS_ERR_IO, NULL);
close(fd);
return REDIS_ERR;
}
Expand Down
27 changes: 27 additions & 0 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <limits.h>

#include "hiredis.h"

Expand All @@ -22,6 +23,7 @@ struct config {
struct {
const char *host;
int port;
struct timeval timeout;
} tcp;

struct {
Expand Down Expand Up @@ -433,6 +435,30 @@ static void test_blocking_io_errors(struct config config) {
redisFree(c);
}

static void test_invalid_timeout_errors(struct config config) {
redisContext *c;

test("Set error when an invalid timeout usec value is given to redisConnectWithTimeout: ");

config.tcp.timeout.tv_sec = 0;
config.tcp.timeout.tv_usec = 10000001;

c = redisConnectWithTimeout(config.tcp.host, config.tcp.port, config.tcp.timeout);

test_cond(c->err == REDIS_ERR_IO);

test("Set error when an invalid timeout sec value is given to redisConnectWithTimeout: ");

config.tcp.timeout.tv_sec = (((LONG_MAX) - 999) / 1000) + 1;
config.tcp.timeout.tv_usec = 0;

c = redisConnectWithTimeout(config.tcp.host, config.tcp.port, config.tcp.timeout);

test_cond(c->err == REDIS_ERR_IO);

redisFree(c);
}

static void test_throughput(struct config config) {
redisContext *c = connect(config);
redisReply **replies;
Expand Down Expand Up @@ -641,6 +667,7 @@ int main(int argc, char **argv) {
cfg.type = CONN_TCP;
test_blocking_connection(cfg);
test_blocking_io_errors(cfg);
test_invalid_timeout_errors(cfg);
if (throughput) test_throughput(cfg);

printf("\nTesting against Unix socket connection (%s):\n", cfg.unix.path);
Expand Down

0 comments on commit fca66b9

Please sign in to comment.