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 +++++++++++++++++++++++++- src/security.c | 4 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) 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); } diff --git a/src/security.c b/src/security.c index 180e2f3..ff67d95 100644 --- a/src/security.c +++ b/src/security.c @@ -23,6 +23,7 @@ #include #include #include +#include #if defined(OWN_VCSA) || defined(OWN_VCS) #include #include @@ -33,6 +34,9 @@ #include "security.h" +#define close(fd) while (((close)(fd) < 0) && (errno == EINTR)) + + static void fail(const char* str) { perror(str); -- cgit v1.2.3-70-g09d2