diff options
author | Denis Vlasenko | 2007-03-13 13:01:14 +0000 |
---|---|---|
committer | Denis Vlasenko | 2007-03-13 13:01:14 +0000 |
commit | 5df955fce2fbdc5b2acc365a120327ff943403da (patch) | |
tree | 41763239e81807259b7532aeef540ebc4804ce3d /loginutils/passwd.c | |
parent | c9c893d4f59418c50c8eb42bd80390026e123dd8 (diff) | |
download | busybox-5df955fce2fbdc5b2acc365a120327ff943403da.zip 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 'loginutils/passwd.c')
-rw-r--r-- | loginutils/passwd.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/loginutils/passwd.c b/loginutils/passwd.c index 4531e63..b937ce4 100644 --- a/loginutils/passwd.c +++ b/loginutils/passwd.c @@ -252,6 +252,13 @@ int passwd_main(int argc, char **argv) struct rlimit rlimit_fsize; char c; +#if ENABLE_FEATURE_SHADOWPASSWDS + /* Using _r function to avoid pulling in static buffers */ + struct spwd spw; + struct spwd *result; + char buffer[256]; +#endif + logmode = LOGMODE_BOTH; openlog(applet_name, LOG_NOWAIT, LOG_AUTH); opt = getopt32(argc, argv, "a:lud", &opt_a); @@ -278,17 +285,14 @@ int passwd_main(int argc, char **argv) filename = bb_path_passwd_file; #if ENABLE_FEATURE_SHADOWPASSWDS - { - struct spwd *sp = getspnam(name); - if (!sp) { - /* LOGMODE_BOTH */ - bb_error_msg("no record of %s in %s, using %s", - name, bb_path_shadow_file, - bb_path_passwd_file); - } else { - filename = bb_path_shadow_file; - pw->pw_passwd = sp->sp_pwdp; - } + if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result)) { + /* LOGMODE_BOTH */ + bb_error_msg("no record of %s in %s, using %s", + name, bb_path_shadow_file, + bb_path_passwd_file); + } else { + filename = bb_path_shadow_file; + pw->pw_passwd = spw.sp_pwdp; } #endif |