aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorvda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-03-13 13:01:14 +0000
committervda <vda@69ca8d6d-28ef-0310-b511-8ec308f3f277>2007-03-13 13:01:14 +0000
commitbf07ea7cef9740b0f10121a8e39965d4f7c7f0e2 (patch)
tree41763239e81807259b7532aeef540ebc4804ce3d /libbb
parent35284053c70e23ba1f7cf6484194dafe0cef6258 (diff)
downloadbusybox-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.c27
-rw-r--r--libbb/lineedit.c13
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
38int correct_password(const struct passwd *pw) 38int 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}