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 /loginutils/passwd.c | |
parent | c9c893d4f59418c50c8eb42bd80390026e123dd8 (diff) | |
download | busybox-w32-5df955fce2fbdc5b2acc365a120327ff943403da.tar.gz busybox-w32-5df955fce2fbdc5b2acc365a120327ff943403da.tar.bz2 busybox-w32-5df955fce2fbdc5b2acc365a120327ff943403da.zip |
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 4531e63a6..b937ce45e 100644 --- a/loginutils/passwd.c +++ b/loginutils/passwd.c | |||
@@ -252,6 +252,13 @@ int passwd_main(int argc, char **argv) | |||
252 | struct rlimit rlimit_fsize; | 252 | struct rlimit rlimit_fsize; |
253 | char c; | 253 | char c; |
254 | 254 | ||
255 | #if ENABLE_FEATURE_SHADOWPASSWDS | ||
256 | /* Using _r function to avoid pulling in static buffers */ | ||
257 | struct spwd spw; | ||
258 | struct spwd *result; | ||
259 | char buffer[256]; | ||
260 | #endif | ||
261 | |||
255 | logmode = LOGMODE_BOTH; | 262 | logmode = LOGMODE_BOTH; |
256 | openlog(applet_name, LOG_NOWAIT, LOG_AUTH); | 263 | openlog(applet_name, LOG_NOWAIT, LOG_AUTH); |
257 | opt = getopt32(argc, argv, "a:lud", &opt_a); | 264 | opt = getopt32(argc, argv, "a:lud", &opt_a); |
@@ -278,17 +285,14 @@ int passwd_main(int argc, char **argv) | |||
278 | 285 | ||
279 | filename = bb_path_passwd_file; | 286 | filename = bb_path_passwd_file; |
280 | #if ENABLE_FEATURE_SHADOWPASSWDS | 287 | #if ENABLE_FEATURE_SHADOWPASSWDS |
281 | { | 288 | if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result)) { |
282 | struct spwd *sp = getspnam(name); | 289 | /* LOGMODE_BOTH */ |
283 | if (!sp) { | 290 | bb_error_msg("no record of %s in %s, using %s", |
284 | /* LOGMODE_BOTH */ | 291 | name, bb_path_shadow_file, |
285 | bb_error_msg("no record of %s in %s, using %s", | 292 | bb_path_passwd_file); |
286 | name, bb_path_shadow_file, | 293 | } else { |
287 | bb_path_passwd_file); | 294 | filename = bb_path_shadow_file; |
288 | } else { | 295 | pw->pw_passwd = spw.sp_pwdp; |
289 | filename = bb_path_shadow_file; | ||
290 | pw->pw_passwd = sp->sp_pwdp; | ||
291 | } | ||
292 | } | 296 | } |
293 | #endif | 297 | #endif |
294 | 298 | ||