X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=libbb%2Fcorrect_password.c;h=6301589e6ae2ba227d138fb3fff27ea025c5c5b9;hb=70186711f45816bdf4562831af3bd995172eb47b;hp=f832635e6b0331a08cfcf8d19c2f55cb13be0230;hpb=85532fc4d49c599dfd0e5be93de38cb8f7cb551c;p=oweals%2Fbusybox.git diff --git a/libbb/correct_password.c b/libbb/correct_password.c index f832635e6..6301589e6 100644 --- a/libbb/correct_password.c +++ b/libbb/correct_password.c @@ -36,14 +36,14 @@ * * NULL pw means "just fake it for login with bad username" */ -int correct_password(const struct passwd *pw) +int FAST_FUNC correct_password(const struct passwd *pw) { char *unencrypted, *encrypted; const char *correct; + int r; #if ENABLE_FEATURE_SHADOWPASSWDS /* Using _r function to avoid pulling in static buffers */ struct spwd spw; - struct spwd *result; char buffer[256]; #endif @@ -55,23 +55,26 @@ int correct_password(const struct passwd *pw) } correct = pw->pw_passwd; #if ENABLE_FEATURE_SHADOWPASSWDS - if (LONE_CHAR(pw->pw_passwd, 'x') || LONE_CHAR(pw->pw_passwd, '*')) { - if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result)) - bb_error_msg("no valid shadow password, checking ordinary one"); - else - correct = spw.sp_pwdp; + if ((correct[0] == 'x' || correct[0] == '*') && !correct[1]) { + /* 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; + r = getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result); + correct = (r || !result) ? "aa" : result->sp_pwdp; } #endif - if (!correct || correct[0] == '\0') + if (!correct[0]) /* empty password field? */ return 1; fake_it: - unencrypted = bb_askpass(0, "Password: "); + unencrypted = bb_ask_stdin("Password: "); if (!unencrypted) { return 0; } - encrypted = crypt(unencrypted, correct); + encrypted = pw_encrypt(unencrypted, correct, 1); + r = (strcmp(encrypted, correct) == 0); + free(encrypted); memset(unencrypted, 0, strlen(unencrypted)); - return strcmp(encrypted, correct) == 0; + return r; }