From d5d56d0d95d295ed7fb6bff1bc6b0c182dacbfa2 Mon Sep 17 00:00:00 2001 From: Joe Hu Date: Fri, 14 Apr 2023 19:14:27 -0400 Subject: [PATCH] Fix redis_check_rdb() hang when rdb is FIFO (#12022) When loading RDB over the named piped, redis_check_rdb() is hung at fopen, because fopen blocks until another process opens the FIFO for writing. The fix is to check if RDB is FIFO. If yes, return an error. --- src/redis-check-rdb.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/redis-check-rdb.c b/src/redis-check-rdb.c index a537c6dae..15d183092 100644 --- a/src/redis-check-rdb.c +++ b/src/redis-check-rdb.c @@ -186,6 +186,12 @@ void rdbCheckSetupSignals(void) { sigaction(SIGABRT, &act, NULL); } +static int isFifo(char *filename) { + struct stat stat_p; + stat(filename, &stat_p); + return S_ISFIFO(stat_p.st_mode); +} + /* Check the specified RDB file. Return 0 if the RDB looks sane, otherwise * 1 is returned. * The file is specified as a filename in 'rdbfilename' if 'fp' is not NULL, @@ -199,6 +205,11 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) { static rio rdb; /* Pointed by global struct riostate. */ struct stat sb; + if (isFifo(rdbfilename)) { + /* Cannot check RDB over named pipe because fopen blocks until another process opens the FIFO for writing. */ + return 1; + } + int closefile = (fp == NULL); if (fp == NULL && (fp = fopen(rdbfilename,"r")) == NULL) return 1;