diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-03-13 13:01:14 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-03-13 13:01:14 +0000 |
commit | 5df955fce2fbdc5b2acc365a120327ff943403da (patch) | |
tree | 41763239e81807259b7532aeef540ebc4804ce3d /libbb | |
parent | c9c893d4f59418c50c8eb42bd80390026e123dd8 (diff) | |
download | busybox-5df955fce2fbdc5b2acc365a120327ff943403da.tar.gz |
Do not fail password check if shadow password does not exist -
fall back to ordinary one
Reduced usage of functions returning datain static buffers.
(mostly passwd/group/shadow related):
function old new delta
correct_password 143 193 +50
sulogin_main 490 533 +43
adduser_main 732 774 +42
passwd_main 1875 1915 +40
addgroup_main 330 365 +35
bb_internal_getspnam 38 - -38
bb_internal_fgetpwent 38 - -38
bb_internal_fgetgrent 38 - -38
static.resultbuf 168 88 -80
static.buffer 1872 1104 -768
------------------------------------------------------------------------------
(add/remove: 0/3 grow/shrink: 5/2 up/down: 210/-962) Total: -752 bytes
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/correct_password.c | 27 | ||||
-rw-r--r-- | libbb/lineedit.c | 13 |
2 files changed, 24 insertions, 16 deletions
diff --git a/libbb/correct_password.c b/libbb/correct_password.c index d031b2109..c515b26af 100644 --- a/libbb/correct_password.c +++ b/libbb/correct_password.c @@ -37,19 +37,24 @@ int correct_password(const struct passwd *pw) { - char *unencrypted, *encrypted, *correct; + char *unencrypted, *encrypted; + const char *correct; +#if ENABLE_FEATURE_SHADOWPASSWDS + /* Using _r function to avoid pulling in static buffers */ + struct spwd spw; + struct spwd *result; + char buffer[256]; +#endif -#ifdef CONFIG_FEATURE_SHADOWPASSWDS + correct = pw->pw_passwd; +#if ENABLE_FEATURE_SHADOWPASSWDS if (LONE_CHAR(pw->pw_passwd, 'x') || LONE_CHAR(pw->pw_passwd, '*')) { - struct spwd *sp = getspnam(pw->pw_name); - - if (!sp) - bb_error_msg_and_die("no valid shadow password"); - - correct = sp->sp_pwdp; - } else + 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; + } #endif - correct = pw->pw_passwd; if (!correct || correct[0] == '\0') return 1; @@ -60,5 +65,5 @@ int correct_password(const struct passwd *pw) } encrypted = crypt(unencrypted, correct); memset(unencrypted, 0, strlen(unencrypted)); - return (!strcmp(encrypted, correct)) ? 1 : 0; + return strcmp(encrypted, correct) == 0; } diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 16256f726..61b88fdc8 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -342,15 +342,18 @@ static void username_tab_completion(char *ud, char *with_shash_flg) } } else { /* "~[^/]*" */ - setpwent(); + /* Using _r function to avoid pulling in static buffers */ + char line_buff[PWD_BUFFER_SIZE]; + struct passwd pwd; + struct passwd *result; - while ((entry = getpwent()) != NULL) { + setpwent(); + while (!getpwent_r(&pwd, line_buff, sizeof(line_buff), &result)) { /* Null usernames should result in all users as possible completions. */ - if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) { - add_match(xasprintf("~%s/", entry->pw_name)); + if (/*!userlen || */ strncmp(ud, pwd.pw_name, userlen) == 0) { + add_match(xasprintf("~%s/", pwd.pw_name)); } } - endpwent(); } } |