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;