X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fcorrect_password.c;h=6301589e6ae2ba227d138fb3fff27ea025c5c5b9;hb=70186711f45816bdf4562831af3bd995172eb47b;hp=d0f68c0cd3bdaf5777973c389006f34046eb785e;hpb=ca525b4f24a1a27ffe5dfc8d04c55227ca335ba0;p=oweals%2Fbusybox.git diff --git a/libbb/correct_password.c b/libbb/correct_password.c index d0f68c0cd..6301589e6 100644 --- a/libbb/correct_password.c +++ b/libbb/correct_password.c @@ -36,44 +36,45 @@ * * 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 - /* fake salt. crypt() can choke otherwise. - * (bb_banner's first two chars are letters and thus are valid salt) */ - correct = bb_banner; + /* fake salt. crypt() can choke otherwise. */ + correct = "aa"; if (!pw) { - /* bb_banner will never match, it contains () which is never - * generated in valid encrypted passwords. */ + /* "aa" will never match */ goto fake_it; } 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; }