]> granicus.if.org Git - sudo/commitdiff
cleanup() now takes an int as an arg so it can be used as a signal
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 18 Nov 2005 01:39:59 +0000 (01:39 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 18 Nov 2005 01:39:59 +0000 (01:39 +0000)
handler too.

error.c
sudo.c
sudo.h
testsudoers.c
visudo.c

diff --git a/error.c b/error.c
index 62fccbaf9050c074a9ea258de32b26d509b55208..73e1fe1ea1c8f269333600ef5207c48934cab183 100644 (file)
--- 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 a68daf577180d8721654865da1b5f2cf93ca7f84..abda444ef6c40447824472d348e3cbd54c8ae87a 100644 (file)
--- 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 9b9f30a323e329bc0c831365a761838cc860a795..f30b1d0b08e723f60e65c69b50e8541129225463 100644 (file)
--- 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));
index 4a2cbff17a0fc669461b355d87bff1c6ffcaa6cc..0146f4660bbdcbf9e46d96dc0be51bbdd846f35e 100644 (file)
@@ -358,10 +358,13 @@ set_perms(perm)
 }
 
 void
-cleanup()
+cleanup(gotsignal)
+    int gotsignal;
 {
-    sudo_endpwent();
-    sudo_endgrent();
+    if (!gotsignal) {
+       sudo_endpwent();
+       sudo_endgrent();
+    }
 }
 
 void
index 21688499258732115efb56293b058617afcb5a25..b05dc1af4bf930ba650d20b22e81e786c295f4c5 100644 (file)
--- 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);