diff options
| author | Mattias Andrée <maandree@operamail.com> | 2015-09-11 05:49:40 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@operamail.com> | 2015-09-11 05:49:40 +0200 |
| commit | 6c9a04cf36de40da05508d42d1c78a16b62775fa (patch) | |
| tree | da66ed50aea79ba575ec1e97533379ce1fcf00b7 | |
| parent | m makefile (diff) | |
| download | cerberus-6c9a04cf36de40da05508d42d1c78a16b62775fa.tar.gz cerberus-6c9a04cf36de40da05508d42d1c78a16b62775fa.tar.bz2 cerberus-6c9a04cf36de40da05508d42d1c78a16b62775fa.tar.xz | |
ensure all fds are closed properly + stop the user from ^c:ing the failure sleep1441943433
Signed-off-by: Mattias Andrée <maandree@operamail.com>
| -rw-r--r-- | src/cerberus.c | 26 | ||||
| -rw-r--r-- | src/security.c | 4 |
2 files changed, 29 insertions, 1 deletions
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 <string.h> #include <unistd.h> +#include <signal.h> +#include <errno.h> #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 /** @@ -60,6 +65,25 @@ char* passphrase = NULL; /** + * 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 * * @param argc The number of command line arguments @@ -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 <fcntl.h> #include <signal.h> #include <stropts.h> +#include <errno.h> #if defined(OWN_VCSA) || defined(OWN_VCS) #include <string.h> #include <linux/vt.h> @@ -33,6 +34,9 @@ #include "security.h" +#define close(fd) while (((close)(fd) < 0) && (errno == EINTR)) + + static void fail(const char* str) { perror(str); |
