From daea0f3b12c18f96b7fde7f33e4b6ef4901e927a Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Sat, 22 Dec 2012 22:31:20 +0200 Subject: [PATCH] input: Avoid (risky) recursive calls to suspend_init --- profiles/input/suspend-dummy.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/profiles/input/suspend-dummy.c b/profiles/input/suspend-dummy.c index 97e42e0af..9fa3fdaf2 100644 --- a/profiles/input/suspend-dummy.c +++ b/profiles/input/suspend-dummy.c @@ -112,28 +112,30 @@ static int fifo_open(void) int suspend_init(suspend_event suspend, resume_event resume) { + struct stat st; int ret; + DBG(""); + suspend_cb = suspend; resume_cb = resume; - if (mkfifo(HOG_SUSPEND_FIFO, S_IRUSR | S_IWUSR) < 0) { - int err = -errno; - - if (err == -EEXIST) { - DBG("FIFO (%s) already exists, trying to remove", - HOG_SUSPEND_FIFO); - - /* remove pre-existing FIFO and retry */ - if (unlink(HOG_SUSPEND_FIFO) < 0) { - err = -errno; - error("Failed to remove FIFO (%s): %s (%d)", - HOG_SUSPEND_FIFO, strerror(-err), -err); - return err; - } + if (stat(HOG_SUSPEND_FIFO, &st) == 0) { + if (!S_ISFIFO(st.st_mode)) { + error("Unexpected non-FIFO %s file", HOG_SUSPEND_FIFO); + return -EIO; + } - return suspend_init(suspend, resume); + if (unlink(HOG_SUSPEND_FIFO) < 0) { + int err = -errno; + error("Failed to remove FIFO (%s): %s (%d)", + HOG_SUSPEND_FIFO, strerror(-err), -err); + return err; } + } + + if (mkfifo(HOG_SUSPEND_FIFO, S_IRUSR | S_IWUSR) < 0) { + int err = -errno; error("Can't create FIFO (%s): %s (%d)", HOG_SUSPEND_FIFO, strerror(-err), -err); -- 2.47.3