]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
* src/passwd.c: Check failure to unlock files. Report errors to
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Fri, 22 Aug 2008 02:24:29 +0000 (02:24 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Fri, 22 Aug 2008 02:24:29 +0000 (02:24 +0000)
stderr and syslog, but continue.

ChangeLog
src/passwd.c

index cc04f21c05c92ccfa2a58132236bca81a802fef3..0271b3a45377f73db4947ff4872b7be8c00c804d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-08-18  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * src/passwd.c: Check failure to unlock files. Report errors to
+       stderr and syslog, but continue.
+
 2008-08-17  Nicolas François  <nicolas.francois@centraliens.net>
 
        * src/chfn.c, src/chgpasswd.c, src/chpasswd.c, src/gpasswd.c,
index 9d19cd46654228cb25fa943b6ceb486574dd0fc5..990e29a387f90360703fcac32b0cc913f9845d92 100644 (file)
@@ -100,6 +100,9 @@ static long inact = 0;              /* Days without change before locked */
 
 static bool do_update_age = false;
 
+static bool pw_locked = false;
+static bool spw_locked = false;
+
 #ifndef USE_PAM
 /*
  * Size of the biggest passwd:
@@ -461,8 +464,22 @@ static void print_status (const struct passwd *pw)
 
 static void fail_exit (int status)
 {
-       pw_unlock ();
-       spw_unlock ();
+       if (pw_locked) {
+               if (pw_unlock () == 0) {
+                       fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, pw_dbname ());
+                       SYSLOG ((LOG_ERR, "failed to unlock %s", pw_dbname ()));
+                       /* continue */
+               }
+       }
+
+       if (spw_locked) {
+               if (spw_unlock () == 0) {
+                       fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, spw_dbname ());
+                       SYSLOG ((LOG_ERR, "failed to unlock %s", spw_dbname ()));
+                       /* continue */
+               }
+       }
+
        exit (status);
 }
 
@@ -517,6 +534,7 @@ static void update_noshadow (void)
                         Prog, pw_dbname ());
                exit (E_PWDBUSY);
        }
+       pw_locked = true;
        if (pw_open (O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
@@ -548,7 +566,12 @@ static void update_noshadow (void)
                SYSLOG ((LOG_ERR, "failure while writing changes to %s", pw_dbname ()));
                fail_exit (E_FAILURE);
        }
-       pw_unlock ();
+       if (pw_unlock () == 0) {
+               fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, pw_dbname ());
+               SYSLOG ((LOG_ERR, "failed to unlock %s", pw_dbname ()));
+               /* continue */
+       }
+       pw_locked = false;
 }
 
 static void update_shadow (void)
@@ -562,6 +585,7 @@ static void update_shadow (void)
                         Prog, spw_dbname ());
                exit (E_PWDBUSY);
        }
+       spw_locked = true;
        if (spw_open (O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, spw_dbname ());
                SYSLOG ((LOG_ERR, "cannot open %s", spw_dbname ()));
@@ -570,9 +594,14 @@ static void update_shadow (void)
        sp = spw_locate (name);
        if (NULL == sp) {
                /* Try to update the password in /etc/passwd instead. */
-               spw_close ();
+               (void) spw_close ();
                update_noshadow ();
-               spw_unlock ();
+               if (spw_unlock () == 0) {
+                       fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, spw_dbname ());
+                       SYSLOG ((LOG_ERR, "failed to unlock %s", spw_dbname ()));
+                       /* continue */
+               }
+               spw_locked = false;
                return;
        }
        nsp = __spw_dup (sp);
@@ -616,7 +645,12 @@ static void update_shadow (void)
                SYSLOG ((LOG_ERR, "failure while writing changes to %s", spw_dbname ()));
                fail_exit (E_FAILURE);
        }
-       spw_unlock ();
+       if (spw_unlock () == 0) {
+               fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, spw_dbname ());
+               SYSLOG ((LOG_ERR, "failed to unlock %s", spw_dbname ()));
+               /* continue */
+       }
+       spw_locked = false;
 }
 
 static long getnumber (const char *numstr)