summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Bedra <aaron@aaronbedra.com>2013-03-14 21:34:21 -0500
committerAaron Bedra <aaron@aaronbedra.com>2013-03-14 21:34:21 -0500
commitfca66b9e8baf760c8bec306f31162b510b04f572 (patch)
treea5fe16aa8156cc7b9b15190ec19ef80c27fcb18d
parentfd38e55d7167048c7be01418db29bae19874a04b (diff)
Set error when invalid timeout value is given to redisConnectWithTimeout
Closes #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 <aaron@aaronbedra.com>
-rw-r--r--net.c1
-rw-r--r--test.c27
2 files changed, 28 insertions, 0 deletions
diff --git a/net.c b/net.c
index 82ab2b4..a495715 100644
--- a/net.c
+++ b/net.c
@@ -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;
}
diff --git a/test.c b/test.c
index 6786003..8de5b74 100644
--- a/test.c
+++ b/test.c
@@ -8,6 +8,7 @@
#include <unistd.h>
#include <signal.h>
#include <errno.h>
+#include <limits.h>
#include "hiredis.h"
@@ -22,6 +23,7 @@ struct config {
struct {
const char *host;
int port;
+ struct timeval timeout;
} tcp;
struct {
@@ -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;
@@ -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);