aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--loginutils/passwd.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/loginutils/passwd.c b/loginutils/passwd.c
index c1481c65e..b447af2f5 100644
--- a/loginutils/passwd.c
+++ b/loginutils/passwd.c
@@ -128,12 +128,20 @@ int passwd_main(int argc UNUSED_PARAM, char **argv)
/* getspnam_r may return 0 yet set result to NULL.
* At least glibc 2.4 does this. Be extra paranoid here. */
struct spwd *result = NULL;
- if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result)
- || !result || strcmp(result->sp_namp, pw->pw_name) != 0) {
- /* LOGMODE_BOTH */
- bb_error_msg("no record of %s in %s, using %s",
+ errno = 0;
+ if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result) != 0
+ || !result /* no error, but no record found either */
+ || strcmp(result->sp_namp, pw->pw_name) != 0 /* paranoia */
+ ) {
+ if (errno != ENOENT) {
+ /* LOGMODE_BOTH */
+ bb_perror_msg("no record of %s in %s, using %s",
name, bb_path_shadow_file,
bb_path_passwd_file);
+ }
+ /* else: /etc/shadow does not exist,
+ * apparently we are on a shadow-less system,
+ * no surprise there */
} else {
pw->pw_passwd = result->sp_pwdp;
}