From 869f3d0ef1513dd0258ad7190c9914df16dcc4a4 Mon Sep 17 00:00:00 2001 From: Michael Grunder Date: Fri, 18 Aug 2023 21:07:25 -0700 Subject: Make redisEnableKeepAlive a no-op on AF_UNIX connections. (#1215) Fixes #1185 --- .gitignore | 1 + net.c | 4 ++++ test.c | 19 +++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/.gitignore b/.gitignore index 056959f..c223f29 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /*.pc *.dSYM tags +compile_commands.json diff --git a/net.c b/net.c index c7d8271..8b7831e 100644 --- a/net.c +++ b/net.c @@ -173,6 +173,10 @@ int redisKeepAlive(redisContext *c, int interval) { int val = 1; redisFD fd = c->fd; + /* TCP_KEEPALIVE makes no sense with AF_UNIX connections */ + if (c->connection_type == REDIS_CONN_UNIX) + return REDIS_ERR; + #ifndef _WIN32 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1){ __redisSetError(c,REDIS_ERR_OTHER,strerror(errno)); diff --git a/test.c b/test.c index 45914af..897daf8 100644 --- a/test.c +++ b/test.c @@ -431,6 +431,24 @@ static void test_tcp_options(struct config cfg) { redisFree(c); } +static void test_unix_keepalive(struct config cfg) { + redisContext *c; + redisReply *r; + + c = do_connect(cfg); + + test("Setting TCP_KEEPALIVE on a unix socket returns an error: "); + test_cond(redisEnableKeepAlive(c) == REDIS_ERR && c->err == 0); + + test("Setting TCP_KEEPALIVE on a unix socket doesn't break the connection: "); + r = redisCommand(c, "PING"); + test_cond(r != NULL && r->type == REDIS_REPLY_STATUS && r->len == 4 && + !memcmp(r->str, "PONG", 4)); + freeReplyObject(r); + + redisFree(c); +} + static void test_reply_reader(void) { redisReader *reader; void *reply, *root; @@ -2363,6 +2381,7 @@ int main(int argc, char **argv) { test_blocking_connection_timeouts(cfg); test_blocking_io_errors(cfg); test_invalid_timeout_errors(cfg); + test_unix_keepalive(cfg); if (throughput) test_throughput(cfg); } else { test_skipped(); -- cgit v1.2.3