]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Improve vipw error report when editor fails
authorNicolas François <nicolas.francois@centraliens.net>
Sun, 25 Aug 2013 14:27:58 +0000 (16:27 +0200)
committerNicolas François <nicolas.francois@centraliens.net>
Sun, 25 Aug 2013 14:27:58 +0000 (16:27 +0200)
* src/vipw.c: After waitpid(), use errno only if waitpid returned
-1. Debian#688260
* src/vipw.c: Likewise for system().

ChangeLog
src/vipw.c

index efc36416ed68a4645c080621122104c4d6d2fe6c..201ce95de2c121a6d5a0456b709fdc066d7729c8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-25  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * src/vipw.c: After waitpid(), use errno only if waitpid returned
+       -1. Debian#688260
+       * src/vipw.c: Likewise for system().
+
 2013-08-23  victory  <victory.deb@gmail.com>
 
        * po/ja.po: Updated to 558t
index 59b79c2cf7b2177f1f752558f8113ed904006f76..6d730f65a3c9f8056e72709b496ffa5c92c21a73 100644 (file)
@@ -180,7 +180,10 @@ static void vipwexit (const char *msg, int syserr, int ret)
        if (0 != syserr) {
                fprintf (stderr, ": %s", strerror (err));
        }
-       (void) fputs ("\n", stderr);
+       if (   (NULL != msg)
+           || (0 != syserr)) {
+               (void) fputs ("\n", stderr);
+       }
        if (!quiet) {
                fprintf (stdout, _("%s: %s is unchanged\n"), Prog,
                         filename);
@@ -297,14 +300,25 @@ vipwedit (const char *file, int (*file_lock) (void), int (*file_unlock) (void))
                /* use the system() call to invoke the editor so that it accepts
                   command line args in the EDITOR and VISUAL environment vars */
                char *buf;
+               int status;
 
                buf = (char *) malloc (strlen (editor) + strlen (fileedit) + 2);
                snprintf (buf, strlen (editor) + strlen (fileedit) + 2,
-                         "%s %s", editor, fileedit);
-               if (system (buf) != 0) {
-                       fprintf (stderr, "%s: %s: %s\n", Prog, editor,
+                         "%s %s", editor, fileedit);
+               status = system (buf);
+               if (-1 == status) {
+                       fprintf (stderr, _("%s: %s: %s\n"), Prog, editor,
                                 strerror (errno));
                        exit (1);
+               } else if (   WIFEXITED (status)
+                          && (WEXITSTATUS (status) != 0)) {
+                       fprintf (stderr, _("%s: %s returned with status %d\n"),
+                                Prog, editor, WEXITSTATUS (status));
+                       exit (WEXITSTATUS (status));
+               } else if (WIFSIGNALED (status)) {
+                       fprintf (stderr, _("%s: %s killed by signal %d\n"),
+                                Prog, editor, WTERMSIG (status));
+                       exit (1);
                } else {
                        exit (0);
                }
@@ -323,10 +337,15 @@ vipwedit (const char *file, int (*file_lock) (void), int (*file_unlock) (void))
                }
        }
 
-       if (   (-1 == pid)
-           || (WIFEXITED (status) == 0)
-           || (WEXITSTATUS (status) != 0)) {
+       if (-1 == pid) {
                vipwexit (editor, 1, 1);
+       } else if (   WIFEXITED (status)
+                  && (WEXITSTATUS (status) != 0)) {
+               vipwexit (NULL, 0, WEXITSTATUS (status));
+       } else if (WIFSIGNALED (status)) {
+               fprintf (stderr, _("%s: %s killed by signal %d\n"),
+                        Prog, editor, WTERMSIG(status));
+               vipwexit (NULL, 0, 1);
        }
 
        if (stat (fileedit, &st2) != 0) {