make pw_encrypt() return malloc'ed string.

text    data     bss     dec     hex filename
 759802     604    6684  767090   bb472 busybox_old
 759804     604    6676  767084   bb46c busybox_unstripped
This commit is contained in:
Denis Vlasenko 2008-06-12 16:56:52 +00:00
parent 4ea83bf562
commit fdddab0c61
7 changed files with 27 additions and 17 deletions

View File

@ -1031,7 +1031,7 @@ extern int restricted_shell(const char *shell);
*/ */
extern void setup_environment(const char *shell, int clear_env, int change_env, const struct passwd *pw); extern void setup_environment(const char *shell, int clear_env, int change_env, const struct passwd *pw);
extern int correct_password(const struct passwd *pw); extern int correct_password(const struct passwd *pw);
/* Returns a ptr to static storage */ /* Returns a malloced string */
extern char *pw_encrypt(const char *clear, const char *salt, int cleanup); extern char *pw_encrypt(const char *clear, const char *salt, int cleanup);
extern int obscure(const char *old, const char *newval, const struct passwd *pwdp); extern int obscure(const char *old, const char *newval, const struct passwd *pwdp);
/* rnd is additional random input. New one is returned. /* rnd is additional random input. New one is returned.

View File

@ -40,6 +40,7 @@ int correct_password(const struct passwd *pw)
{ {
char *unencrypted, *encrypted; char *unencrypted, *encrypted;
const char *correct; const char *correct;
int r;
#if ENABLE_FEATURE_SHADOWPASSWDS #if ENABLE_FEATURE_SHADOWPASSWDS
/* Using _r function to avoid pulling in static buffers */ /* Using _r function to avoid pulling in static buffers */
struct spwd spw; struct spwd spw;
@ -72,6 +73,8 @@ int correct_password(const struct passwd *pw)
return 0; return 0;
} }
encrypted = pw_encrypt(unencrypted, correct, 1); encrypted = pw_encrypt(unencrypted, correct, 1);
r = (strcmp(encrypted, correct) == 0);
free(encrypted);
memset(unencrypted, 0, strlen(unencrypted)); memset(unencrypted, 0, strlen(unencrypted));
return strcmp(encrypted, correct) == 0; return r;
} }

View File

@ -54,7 +54,7 @@ static void my_crypt_cleanup(void)
char *pw_encrypt(const char *clear, const char *salt, int cleanup) char *pw_encrypt(const char *clear, const char *salt, int cleanup)
{ {
static char *cipher; char *encrypted;
#if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */ #if 0 /* was CONFIG_FEATURE_SHA1_PASSWORDS, but there is no such thing??? */
if (strncmp(salt, "$2$", 3) == 0) { if (strncmp(salt, "$2$", 3) == 0) {
@ -62,11 +62,10 @@ char *pw_encrypt(const char *clear, const char *salt, int cleanup)
} }
#endif #endif
free(cipher); encrypted = my_crypt(clear, salt);
cipher = my_crypt(clear, salt);
if (cleanup) if (cleanup)
my_crypt_cleanup(); my_crypt_cleanup();
return cipher; return encrypted;
} }

View File

@ -65,6 +65,7 @@ int chpasswd_main(int argc ATTRIBUTE_UNUSED, char **argv)
bb_info_msg("Password for '%s' changed", name); bb_info_msg("Password for '%s' changed", name);
logmode = LOGMODE_STDIO; logmode = LOGMODE_STDIO;
free(name); free(name);
free(pass);
} }
return 0; return 0;

View File

@ -16,22 +16,24 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
char salt[sizeof("$N$XXXXXXXX")]; /* "$N$XXXXXXXX" or "XX" */ char salt[sizeof("$N$XXXXXXXX")]; /* "$N$XXXXXXXX" or "XX" */
char *orig = (char*)""; char *orig = (char*)"";
char *newp = NULL; char *newp = NULL;
char *cipher = NULL;
char *cp = NULL; char *cp = NULL;
char *ret = NULL; /* failure so far */ char *ret = NULL; /* failure so far */
if (myuid && pw->pw_passwd[0]) { if (myuid && pw->pw_passwd[0]) {
char *encrypted;
orig = bb_askpass(0, "Old password:"); /* returns ptr to static */ orig = bb_askpass(0, "Old password:"); /* returns ptr to static */
if (!orig) if (!orig)
goto err_ret; goto err_ret;
cipher = pw_encrypt(orig, pw->pw_passwd, 1); /* returns ptr to static */ encrypted = pw_encrypt(orig, pw->pw_passwd, 1); /* returns malloced str */
if (strcmp(cipher, pw->pw_passwd) != 0) { if (strcmp(encrypted, pw->pw_passwd) != 0) {
syslog(LOG_WARNING, "incorrect password for '%s'", syslog(LOG_WARNING, "incorrect password for '%s'",
pw->pw_name); pw->pw_name);
bb_do_delay(FAIL_DELAY); bb_do_delay(FAIL_DELAY);
puts("Incorrect password"); puts("Incorrect password");
goto err_ret; goto err_ret;
} }
if (ENABLE_FEATURE_CLEAN_UP) free(encrypted);
} }
orig = xstrdup(orig); /* or else bb_askpass() will destroy it */ orig = xstrdup(orig); /* or else bb_askpass() will destroy it */
newp = bb_askpass(0, "New password:"); /* returns ptr to static */ newp = bb_askpass(0, "New password:"); /* returns ptr to static */
@ -55,8 +57,8 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
strcpy(salt, "$1$"); strcpy(salt, "$1$");
crypt_make_salt(salt + 3, 4, 0); crypt_make_salt(salt + 3, 4, 0);
} }
/* pw_encrypt returns ptr to static */ /* pw_encrypt returns malloced str */
ret = xstrdup(pw_encrypt(newp, salt, 1)); ret = pw_encrypt(newp, salt, 1);
/* whee, success! */ /* whee, success! */
err_ret: err_ret:
@ -64,7 +66,6 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
if (ENABLE_FEATURE_CLEAN_UP) free(orig); if (ENABLE_FEATURE_CLEAN_UP) free(orig);
nuke_str(newp); nuke_str(newp);
if (ENABLE_FEATURE_CLEAN_UP) free(newp); if (ENABLE_FEATURE_CLEAN_UP) free(newp);
nuke_str(cipher);
nuke_str(cp); nuke_str(cp);
return ret; return ret;
} }

View File

@ -72,6 +72,9 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv)
#endif #endif
while (1) { while (1) {
char *encrypted;
int r;
/* cp points to a static buffer that is zeroed every time */ /* cp points to a static buffer that is zeroed every time */
cp = bb_askpass(timeout, cp = bb_askpass(timeout,
"Give root password for system maintenance\n" "Give root password for system maintenance\n"
@ -81,7 +84,10 @@ int sulogin_main(int argc ATTRIBUTE_UNUSED, char **argv)
bb_info_msg("Normal startup"); bb_info_msg("Normal startup");
return 0; return 0;
} }
if (strcmp(pw_encrypt(cp, pwd->pw_passwd, 1), pwd->pw_passwd) == 0) { encrypted = pw_encrypt(cp, pwd->pw_passwd, 1);
r = strcmp(encrypted, pwd->pw_passwd);
free(encrypted);
if (r == 0) {
break; break;
} }
bb_do_delay(FAIL_DELAY); bb_do_delay(FAIL_DELAY);

View File

@ -1721,7 +1721,6 @@ static int checkPerm(const char *path, const char *request)
} }
if (ENABLE_FEATURE_HTTPD_AUTH_MD5) { if (ENABLE_FEATURE_HTTPD_AUTH_MD5) {
char *cipher;
char *pp; char *pp;
if (strncmp(p, request, u - request) != 0) { if (strncmp(p, request, u - request) != 0) {
@ -1732,9 +1731,10 @@ static int checkPerm(const char *path, const char *request)
if (pp && pp[1] == '$' && pp[2] == '1' if (pp && pp[1] == '$' && pp[2] == '1'
&& pp[3] == '$' && pp[4] && pp[3] == '$' && pp[4]
) { ) {
pp++; char *encrypted = pw_encrypt(u+1, ++pp, 1);
cipher = pw_encrypt(u+1, pp, 1); int r = strcmp(encrypted, pp);
if (strcmp(cipher, pp) == 0) free(encrypted);
if (r == 0)
goto set_remoteuser_var; /* Ok */ goto set_remoteuser_var; /* Ok */
/* unauthorized */ /* unauthorized */
continue; continue;