From: Todd C. Miller Date: Fri, 18 Nov 2005 01:39:59 +0000 (+0000) Subject: cleanup() now takes an int as an arg so it can be used as a signal X-Git-Tag: SUDO_1_7_0~602 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d282cd226be023c278ebe4e7d0caf06603e35c3;p=sudo cleanup() now takes an int as an arg so it can be used as a signal handler too. --- diff --git a/error.c b/error.c index 62fccbaf9..73e1fe1ea 100644 --- a/error.c +++ b/error.c @@ -28,7 +28,7 @@ __unused static const char rcsid[] = "$Sudo$"; #endif /* lint */ static void _warning __P((int, const char *, va_list)); - void cleanup __P((void)); + void cleanup __P((int)); void #ifdef __STDC__ @@ -48,7 +48,7 @@ error(eval, fmt, va_alist) #endif _warning(1, fmt, ap); va_end(ap); - cleanup(); + cleanup(0); exit(eval); } @@ -70,7 +70,7 @@ errorx(eval, fmt, va_alist) #endif _warning(0, fmt, ap); va_end(ap); - cleanup(); + cleanup(0); exit(eval); } diff --git a/sudo.c b/sudo.c index a68daf577..abda444ef 100644 --- a/sudo.c +++ b/sudo.c @@ -1163,10 +1163,13 @@ get_authpw() * Stub for error()/errorx() */ void -cleanup() +cleanup(gotsignal) + int gotsignal; { - sudo_endpwent(); - sudo_endgrent(); + if (!gotsignal) { + sudo_endpwent(); + sudo_endgrent(); + } } /* diff --git a/sudo.h b/sudo.h index 9b9f30a32..f30b1d0b0 100644 --- a/sudo.h +++ b/sudo.h @@ -260,7 +260,7 @@ void sudo_setpwent __P((void)); void sudo_endpwent __P((void)); void sudo_setspent __P((void)); void sudo_endspent __P((void)); -void cleanup __P((void)); +void cleanup __P((int)); struct passwd *sudo_getpwnam __P((const char *)); struct passwd *sudo_fakepwnam __P((const char *)); struct passwd *sudo_getpwuid __P((uid_t)); diff --git a/testsudoers.c b/testsudoers.c index 4a2cbff17..0146f4660 100644 --- a/testsudoers.c +++ b/testsudoers.c @@ -358,10 +358,13 @@ set_perms(perm) } void -cleanup() +cleanup(gotsignal) + int gotsignal; { - sudo_endpwent(); - sudo_endgrent(); + if (!gotsignal) { + sudo_endpwent(); + sudo_endgrent(); + } } void diff --git a/visudo.c b/visudo.c index 216884992..b05dc1af4 100644 --- a/visudo.c +++ b/visudo.c @@ -435,7 +435,7 @@ reparse_sudoers(editor, args, strict, quiet) switch (whatnow()) { case 'Q' : parse_error = FALSE; /* ignore parse error */ break; - case 'x' : cleanup(); + case 'x' : cleanup(0); exit(0); break; } @@ -978,7 +978,8 @@ print_unused(v1, v2) * Unlink any sudoers temp files that remain. */ void -cleanup() +cleanup(gotsignal) + int gotsignal; { struct sudoersfile *sp; @@ -986,12 +987,10 @@ cleanup() if (sp->tpath != NULL) (void) unlink(sp->tpath); } - /* - * XXX - would like to call sudo_endpwent/sudo_endgrent but they - * are not signal-safe. - sudo_endpwent(); - sudo_endgrent(); - */ + if (!gotsignal) { + sudo_endpwent(); + sudo_endgrent(); + } } /* @@ -1001,7 +1000,7 @@ static RETSIGTYPE quit(signo) int signo; { - cleanup(); + cleanup(signo); #define emsg " exiting due to signal.\n" write(STDERR_FILENO, getprogname(), strlen(getprogname())); write(STDERR_FILENO, emsg, sizeof(emsg) - 1);