From 6c9a04cf36de40da05508d42d1c78a16b62775fa Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Fri, 11 Sep 2015 05:49:40 +0200 Subject: ensure all fds are closed properly + stop the user from ^c:ing the failure sleep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/cerberus.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/cerberus.c') diff --git a/src/cerberus.c b/src/cerberus.c index 418ec8a..3a7b9af 100644 --- a/src/cerberus.c +++ b/src/cerberus.c @@ -20,6 +20,8 @@ #include #include +#include +#include #define HOOK_LOGIN 0 @@ -28,6 +30,9 @@ #define HOOK_VERIFY 3 +#define close(fd) while (((close)(fd) < 0) && (errno == EINTR)) + + #ifdef USE_TTY_GROUP /** @@ -59,6 +64,25 @@ char* passphrase = NULL; #endif +/** + * Sleep without letting the user stop it + * + * @param s The number of seconds to sleep + */ +static void xsleep(unsigned int s) +{ + sigset_t sigset; + + sigfillset(&sigset); + sigprocmask(SIG_BLOCK, &sigset, NULL); + + while ((s = sleep(s))); + + sigemptyset(&sigset); + sigprocmask(SIG_BLOCK, &sigset, NULL); +} + + /** * Mane method * @@ -356,7 +380,7 @@ void do_login(int argc, char** argv) { preexit(); fork_exec_wait_hook(HOOK_DENIED, argc, argv); - sleep(FAILURE_SLEEP); + xsleep(FAILURE_SLEEP); _exit(1); } -- cgit v1.2.3-70-g09d2