diff options
author | vda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2007-03-13 13:01:14 +0000 |
---|---|---|
committer | vda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2007-03-13 13:01:14 +0000 |
commit | bf07ea7cef9740b0f10121a8e39965d4f7c7f0e2 (patch) | |
tree | 41763239e81807259b7532aeef540ebc4804ce3d /libbb | |
parent | 35284053c70e23ba1f7cf6484194dafe0cef6258 (diff) | |
download | busybox-w32-bf07ea7cef9740b0f10121a8e39965d4f7c7f0e2.tar.gz busybox-w32-bf07ea7cef9740b0f10121a8e39965d4f7c7f0e2.tar.bz2 busybox-w32-bf07ea7cef9740b0f10121a8e39965d4f7c7f0e2.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
git-svn-id: svn://busybox.net/trunk/busybox@18085 69ca8d6d-28ef-0310-b511-8ec308f3f277
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 @@ | |||
37 | 37 | ||
38 | int correct_password(const struct passwd *pw) | 38 | int correct_password(const struct passwd *pw) |
39 | { | 39 | { |
40 | char *unencrypted, *encrypted, *correct; | 40 | char *unencrypted, *encrypted; |
41 | const char *correct; | ||
42 | #if ENABLE_FEATURE_SHADOWPASSWDS | ||
43 | /* Using _r function to avoid pulling in static buffers */ | ||
44 | struct spwd spw; | ||
45 | struct spwd *result; | ||
46 | char buffer[256]; | ||
47 | #endif | ||
41 | 48 | ||
42 | #ifdef CONFIG_FEATURE_SHADOWPASSWDS | 49 | correct = pw->pw_passwd; |
50 | #if ENABLE_FEATURE_SHADOWPASSWDS | ||
43 | if (LONE_CHAR(pw->pw_passwd, 'x') || LONE_CHAR(pw->pw_passwd, '*')) { | 51 | if (LONE_CHAR(pw->pw_passwd, 'x') || LONE_CHAR(pw->pw_passwd, '*')) { |
44 | struct spwd *sp = getspnam(pw->pw_name); | 52 | if (getspnam_r(pw->pw_name, &spw, buffer, sizeof(buffer), &result)) |
45 | 53 | bb_error_msg("no valid shadow password, checking ordinary one"); | |
46 | if (!sp) | 54 | else |
47 | bb_error_msg_and_die("no valid shadow password"); | 55 | correct = spw.sp_pwdp; |
48 | 56 | } | |
49 | correct = sp->sp_pwdp; | ||
50 | } else | ||
51 | #endif | 57 | #endif |
52 | correct = pw->pw_passwd; | ||
53 | 58 | ||
54 | if (!correct || correct[0] == '\0') | 59 | if (!correct || correct[0] == '\0') |
55 | return 1; | 60 | return 1; |
@@ -60,5 +65,5 @@ int correct_password(const struct passwd *pw) | |||
60 | } | 65 | } |
61 | encrypted = crypt(unencrypted, correct); | 66 | encrypted = crypt(unencrypted, correct); |
62 | memset(unencrypted, 0, strlen(unencrypted)); | 67 | memset(unencrypted, 0, strlen(unencrypted)); |
63 | return (!strcmp(encrypted, correct)) ? 1 : 0; | 68 | return strcmp(encrypted, correct) == 0; |
64 | } | 69 | } |
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) | |||
342 | } | 342 | } |
343 | } else { | 343 | } else { |
344 | /* "~[^/]*" */ | 344 | /* "~[^/]*" */ |
345 | setpwent(); | 345 | /* Using _r function to avoid pulling in static buffers */ |
346 | char line_buff[PWD_BUFFER_SIZE]; | ||
347 | struct passwd pwd; | ||
348 | struct passwd *result; | ||
346 | 349 | ||
347 | while ((entry = getpwent()) != NULL) { | 350 | setpwent(); |
351 | while (!getpwent_r(&pwd, line_buff, sizeof(line_buff), &result)) { | ||
348 | /* Null usernames should result in all users as possible completions. */ | 352 | /* Null usernames should result in all users as possible completions. */ |
349 | if ( /*!userlen || */ !strncmp(ud, entry->pw_name, userlen)) { | 353 | if (/*!userlen || */ strncmp(ud, pwd.pw_name, userlen) == 0) { |
350 | add_match(xasprintf("~%s/", entry->pw_name)); | 354 | add_match(xasprintf("~%s/", pwd.pw_name)); |
351 | } | 355 | } |
352 | } | 356 | } |
353 | |||
354 | endpwent(); | 357 | endpwent(); |
355 | } | 358 | } |
356 | } | 359 | } |