aboutsummaryrefslogtreecommitdiff
path: root/loginutils
diff options
context:
space:
mode:
authorEinar Jón <tolvupostur@gmail.com>2019-01-08 16:31:37 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2019-01-08 16:32:25 +0100
commitce51140664d82300d25b096b4a41f01fdfd766b3 (patch)
tree95b02b340288d67e5fa10f4608066e9eed2354de /loginutils
parent959b04bc0e9d23daa51f75130c7d3eeacd91e52c (diff)
downloadbusybox-w32-ce51140664d82300d25b096b4a41f01fdfd766b3.tar.gz
busybox-w32-ce51140664d82300d25b096b4a41f01fdfd766b3.tar.bz2
busybox-w32-ce51140664d82300d25b096b4a41f01fdfd766b3.zip
passwd: initialize pointers correctly
Fix for running passwd as root (or sudo passwd $USER). Crashed on call to free(orig) during cleanup. Fix regression from commit 17058a06c4333fc0c492c168c8a971ebd0fd5a5a Root user never changes the orig pointer, so when cleaning up, passwd tried to free orig=(char*)"" Example: sudo passwd $USER Changing password for xxx New password: Bad password: too short Retype password: Passwords don't match free(): invalid pointer Aborted function old new delta passwd_main 958 961 +3 Signed-off-by: Einar Jón <tolvupostur@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'loginutils')
-rw-r--r--loginutils/passwd.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/loginutils/passwd.c b/loginutils/passwd.c
index 59f47fc7b..30e096460 100644
--- a/loginutils/passwd.c
+++ b/loginutils/passwd.c
@@ -43,7 +43,7 @@
43static char* new_password(const struct passwd *pw, uid_t myuid, const char *algo) 43static char* new_password(const struct passwd *pw, uid_t myuid, const char *algo)
44{ 44{
45 char salt[MAX_PW_SALT_LEN]; 45 char salt[MAX_PW_SALT_LEN];
46 char *orig = (char*)""; 46 char *orig = NULL;
47 char *newp = NULL; 47 char *newp = NULL;
48 char *cp = NULL; 48 char *cp = NULL;
49 char *ret = NULL; /* failure so far */ 49 char *ret = NULL; /* failure so far */
@@ -51,7 +51,7 @@ static char* new_password(const struct passwd *pw, uid_t myuid, const char *algo
51 if (myuid != 0 && pw->pw_passwd[0]) { 51 if (myuid != 0 && pw->pw_passwd[0]) {
52 char *encrypted; 52 char *encrypted;
53 53
54 orig = bb_ask_noecho_stdin("Old password: "); /* returns ptr to static */ 54 orig = bb_ask_noecho_stdin("Old password: "); /* returns malloced str */
55 if (!orig) 55 if (!orig)
56 goto err_ret; 56 goto err_ret;
57 encrypted = pw_encrypt(orig, pw->pw_passwd, 1); /* returns malloced str */ 57 encrypted = pw_encrypt(orig, pw->pw_passwd, 1); /* returns malloced str */
@@ -64,11 +64,11 @@ static char* new_password(const struct passwd *pw, uid_t myuid, const char *algo
64 if (ENABLE_FEATURE_CLEAN_UP) 64 if (ENABLE_FEATURE_CLEAN_UP)
65 free(encrypted); 65 free(encrypted);
66 } 66 }
67 newp = bb_ask_noecho_stdin("New password: "); /* returns ptr to static */ 67 newp = bb_ask_noecho_stdin("New password: "); /* returns malloced str */
68 if (!newp) 68 if (!newp)
69 goto err_ret; 69 goto err_ret;
70 if (ENABLE_FEATURE_PASSWD_WEAK_CHECK 70 if (ENABLE_FEATURE_PASSWD_WEAK_CHECK
71 && obscure(orig, newp, pw) 71 && obscure(orig, newp, pw) /* NB: passing NULL orig is ok */
72 && myuid != 0 72 && myuid != 0
73 ) { 73 ) {
74 goto err_ret; /* non-root is not allowed to have weak passwd */ 74 goto err_ret; /* non-root is not allowed to have weak passwd */