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 | |
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
-rw-r--r-- | libbb/correct_password.c | 27 | ||||
-rw-r--r-- | libbb/lineedit.c | 13 | ||||
-rw-r--r-- | libpwdgrp/pwd_grp.c | 20 | ||||
-rw-r--r-- | loginutils/addgroup.c | 45 | ||||
-rw-r--r-- | loginutils/adduser.c | 35 | ||||
-rw-r--r-- | loginutils/passwd.c | 26 | ||||
-rw-r--r-- | loginutils/sulogin.c | 15 | ||||
-rwxr-xr-x | scripts/objsizes | 17 |
8 files changed, 120 insertions, 78 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 | } |
diff --git a/libpwdgrp/pwd_grp.c b/libpwdgrp/pwd_grp.c index 7aed265b9..7a8a23745 100644 --- a/libpwdgrp/pwd_grp.c +++ b/libpwdgrp/pwd_grp.c | |||
@@ -121,9 +121,10 @@ int fgetspent_r(FILE *__restrict stream, struct spwd *__restrict resultbuf, | |||
121 | /**********************************************************************/ | 121 | /**********************************************************************/ |
122 | /* For the various fget??ent funcs, return NULL on failure and a | 122 | /* For the various fget??ent funcs, return NULL on failure and a |
123 | * pointer to the appropriate struct (statically allocated) on success. | 123 | * pointer to the appropriate struct (statically allocated) on success. |
124 | */ | 124 | * TODO: audit & stop using these in bbox, they pull in static buffers */ |
125 | /**********************************************************************/ | 125 | /**********************************************************************/ |
126 | 126 | ||
127 | #if 0 | ||
127 | struct passwd *fgetpwent(FILE *stream) | 128 | struct passwd *fgetpwent(FILE *stream) |
128 | { | 129 | { |
129 | static char buffer[PWD_BUFFER_SIZE]; | 130 | static char buffer[PWD_BUFFER_SIZE]; |
@@ -143,8 +144,10 @@ struct group *fgetgrent(FILE *stream) | |||
143 | fgetgrent_r(stream, &resultbuf, buffer, sizeof(buffer), &result); | 144 | fgetgrent_r(stream, &resultbuf, buffer, sizeof(buffer), &result); |
144 | return result; | 145 | return result; |
145 | } | 146 | } |
147 | #endif | ||
146 | 148 | ||
147 | #if ENABLE_USE_BB_SHADOW | 149 | #if ENABLE_USE_BB_SHADOW |
150 | #if 0 | ||
148 | struct spwd *fgetspent(FILE *stream) | 151 | struct spwd *fgetspent(FILE *stream) |
149 | { | 152 | { |
150 | static char buffer[PWD_BUFFER_SIZE]; | 153 | static char buffer[PWD_BUFFER_SIZE]; |
@@ -154,6 +157,7 @@ struct spwd *fgetspent(FILE *stream) | |||
154 | fgetspent_r(stream, &resultbuf, buffer, sizeof(buffer), &result); | 157 | fgetspent_r(stream, &resultbuf, buffer, sizeof(buffer), &result); |
155 | return result; | 158 | return result; |
156 | } | 159 | } |
160 | #endif | ||
157 | 161 | ||
158 | int sgetspent_r(const char *string, struct spwd *result_buf, | 162 | int sgetspent_r(const char *string, struct spwd *result_buf, |
159 | char *buffer, size_t buflen, struct spwd **result) | 163 | char *buffer, size_t buflen, struct spwd **result) |
@@ -230,7 +234,9 @@ int sgetspent_r(const char *string, struct spwd *result_buf, | |||
230 | #include "pwd_grp_internal.c" | 234 | #include "pwd_grp_internal.c" |
231 | 235 | ||
232 | /**********************************************************************/ | 236 | /**********************************************************************/ |
237 | /* TODO: audit & stop using these in bbox, they pull in static buffers */ | ||
233 | 238 | ||
239 | /* This one has many users */ | ||
234 | struct passwd *getpwuid(uid_t uid) | 240 | struct passwd *getpwuid(uid_t uid) |
235 | { | 241 | { |
236 | static char buffer[PWD_BUFFER_SIZE]; | 242 | static char buffer[PWD_BUFFER_SIZE]; |
@@ -241,6 +247,7 @@ struct passwd *getpwuid(uid_t uid) | |||
241 | return result; | 247 | return result; |
242 | } | 248 | } |
243 | 249 | ||
250 | /* This one has many users */ | ||
244 | struct group *getgrgid(gid_t gid) | 251 | struct group *getgrgid(gid_t gid) |
245 | { | 252 | { |
246 | static char buffer[GRP_BUFFER_SIZE]; | 253 | static char buffer[GRP_BUFFER_SIZE]; |
@@ -286,6 +293,7 @@ struct spwd *getspuid(uid_t uid) | |||
286 | } | 293 | } |
287 | #endif | 294 | #endif |
288 | 295 | ||
296 | /* This one has many users */ | ||
289 | struct passwd *getpwnam(const char *name) | 297 | struct passwd *getpwnam(const char *name) |
290 | { | 298 | { |
291 | static char buffer[PWD_BUFFER_SIZE]; | 299 | static char buffer[PWD_BUFFER_SIZE]; |
@@ -296,6 +304,7 @@ struct passwd *getpwnam(const char *name) | |||
296 | return result; | 304 | return result; |
297 | } | 305 | } |
298 | 306 | ||
307 | /* This one has many users */ | ||
299 | struct group *getgrnam(const char *name) | 308 | struct group *getgrnam(const char *name) |
300 | { | 309 | { |
301 | static char buffer[GRP_BUFFER_SIZE]; | 310 | static char buffer[GRP_BUFFER_SIZE]; |
@@ -306,7 +315,7 @@ struct group *getgrnam(const char *name) | |||
306 | return result; | 315 | return result; |
307 | } | 316 | } |
308 | 317 | ||
309 | #if ENABLE_USE_BB_SHADOW | 318 | #if 0 //ENABLE_USE_BB_SHADOW |
310 | struct spwd *getspnam(const char *name) | 319 | struct spwd *getspnam(const char *name) |
311 | { | 320 | { |
312 | static char buffer[PWD_BUFFER_SIZE]; | 321 | static char buffer[PWD_BUFFER_SIZE]; |
@@ -318,6 +327,7 @@ struct spwd *getspnam(const char *name) | |||
318 | } | 327 | } |
319 | #endif | 328 | #endif |
320 | 329 | ||
330 | /* This one doesn't use static buffers */ | ||
321 | int getpw(uid_t uid, char *buf) | 331 | int getpw(uid_t uid, char *buf) |
322 | { | 332 | { |
323 | struct passwd resultbuf; | 333 | struct passwd resultbuf; |
@@ -325,7 +335,7 @@ int getpw(uid_t uid, char *buf) | |||
325 | char buffer[PWD_BUFFER_SIZE]; | 335 | char buffer[PWD_BUFFER_SIZE]; |
326 | 336 | ||
327 | if (!buf) { | 337 | if (!buf) { |
328 | errno=EINVAL; | 338 | errno = EINVAL; |
329 | } else if (!getpwuid_r(uid, &resultbuf, buffer, sizeof(buffer), &result)) { | 339 | } else if (!getpwuid_r(uid, &resultbuf, buffer, sizeof(buffer), &result)) { |
330 | if (sprintf(buf, "%s:%s:%lu:%lu:%s:%s:%s\n", | 340 | if (sprintf(buf, "%s:%s:%lu:%lu:%s:%s:%s\n", |
331 | resultbuf.pw_name, resultbuf.pw_passwd, | 341 | resultbuf.pw_name, resultbuf.pw_passwd, |
@@ -497,6 +507,7 @@ int getspent_r(struct spwd *resultbuf, char *buffer, | |||
497 | } | 507 | } |
498 | #endif | 508 | #endif |
499 | 509 | ||
510 | #if 0 | ||
500 | struct passwd *getpwent(void) | 511 | struct passwd *getpwent(void) |
501 | { | 512 | { |
502 | static char line_buff[PWD_BUFFER_SIZE]; | 513 | static char line_buff[PWD_BUFFER_SIZE]; |
@@ -516,8 +527,9 @@ struct group *getgrent(void) | |||
516 | getgrent_r(&gr, line_buff, sizeof(line_buff), &result); | 527 | getgrent_r(&gr, line_buff, sizeof(line_buff), &result); |
517 | return result; | 528 | return result; |
518 | } | 529 | } |
530 | #endif | ||
519 | 531 | ||
520 | #if ENABLE_USE_BB_SHADOW | 532 | #if 0 //ENABLE_USE_BB_SHADOW |
521 | struct spwd *getspent(void) | 533 | struct spwd *getspent(void) |
522 | { | 534 | { |
523 | static char line_buff[PWD_BUFFER_SIZE]; | 535 | static char line_buff[PWD_BUFFER_SIZE]; |
diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c index 768d2c061..78250a418 100644 --- a/loginutils/addgroup.c +++ b/loginutils/addgroup.c | |||
@@ -15,35 +15,37 @@ | |||
15 | * return 1 on failure */ | 15 | * return 1 on failure */ |
16 | static int group_study(struct group *g) | 16 | static int group_study(struct group *g) |
17 | { | 17 | { |
18 | enum { max = 65000 }; | ||
18 | FILE *etc_group; | 19 | FILE *etc_group; |
19 | gid_t desired; | 20 | gid_t desired; |
20 | 21 | /* Using _r function to avoid static buffers pulled in */ | |
21 | struct group *grp; | 22 | char buffer[256]; |
22 | const int max = 65000; | 23 | struct group grp; |
24 | struct group *result; | ||
23 | 25 | ||
24 | etc_group = xfopen(bb_path_group_file, "r"); | 26 | etc_group = xfopen(bb_path_group_file, "r"); |
25 | 27 | ||
26 | /* make sure gr_name isn't taken, make sure gid is kosher */ | 28 | /* make sure gr_name isn't taken, make sure gid is kosher */ |
27 | desired = g->gr_gid; | 29 | desired = g->gr_gid; |
28 | while ((grp = fgetgrent(etc_group))) { | 30 | while (!fgetgrent_r(etc_group, &grp, buffer, sizeof(buffer), &result)) { |
29 | if ((strcmp(grp->gr_name, g->gr_name)) == 0) { | 31 | if ((strcmp(grp.gr_name, g->gr_name)) == 0) { |
30 | bb_error_msg_and_die("%s: group already in use", g->gr_name); | 32 | bb_error_msg_and_die("%s: group already in use", g->gr_name); |
31 | } | 33 | } |
32 | if ((desired) && grp->gr_gid == desired) { | 34 | if ((desired) && grp.gr_gid == desired) { |
33 | bb_error_msg_and_die("%d: gid already in use", | 35 | bb_error_msg_and_die("%d: gid already in use", |
34 | desired); | 36 | desired); |
35 | } | 37 | } |
36 | if ((grp->gr_gid > g->gr_gid) && (grp->gr_gid < max)) { | 38 | if ((grp.gr_gid > g->gr_gid) && (grp.gr_gid < max)) { |
37 | g->gr_gid = grp->gr_gid; | 39 | g->gr_gid = grp.gr_gid; |
38 | } | 40 | } |
39 | } | 41 | } |
40 | fclose(etc_group); | 42 | if (ENABLE_FEATURE_CLEAN_UP) |
43 | fclose(etc_group); | ||
41 | 44 | ||
42 | /* gid */ | 45 | /* gid */ |
46 | g->gr_gid++; | ||
43 | if (desired) { | 47 | if (desired) { |
44 | g->gr_gid = desired; | 48 | g->gr_gid = desired; |
45 | } else { | ||
46 | g->gr_gid++; | ||
47 | } | 49 | } |
48 | /* return 1; */ | 50 | /* return 1; */ |
49 | return 0; | 51 | return 0; |
@@ -65,12 +67,16 @@ static int addgroup(char *group, gid_t gid, const char *user) | |||
65 | file = xfopen(bb_path_group_file, "a"); | 67 | file = xfopen(bb_path_group_file, "a"); |
66 | /* group:passwd:gid:userlist */ | 68 | /* group:passwd:gid:userlist */ |
67 | fprintf(file, "%s:%s:%d:%s\n", group, "x", gr.gr_gid, user); | 69 | fprintf(file, "%s:%s:%d:%s\n", group, "x", gr.gr_gid, user); |
68 | fclose(file); | 70 | if (ENABLE_FEATURE_CLEAN_UP) |
71 | fclose(file); | ||
69 | 72 | ||
70 | #if ENABLE_FEATURE_SHADOWPASSWDS | 73 | #if ENABLE_FEATURE_SHADOWPASSWDS |
71 | file = xfopen(bb_path_gshadow_file, "a"); | 74 | file = fopen_or_warn(bb_path_gshadow_file, "a"); |
72 | fprintf(file, "%s:!::\n", group); | 75 | if (file) { |
73 | fclose(file); | 76 | fprintf(file, "%s:!::\n", group); |
77 | if (ENABLE_FEATURE_CLEAN_UP) | ||
78 | fclose(file); | ||
79 | } | ||
74 | #endif | 80 | #endif |
75 | 81 | ||
76 | /* return 1; */ | 82 | /* return 1; */ |
@@ -80,10 +86,8 @@ static int addgroup(char *group, gid_t gid, const char *user) | |||
80 | /* | 86 | /* |
81 | * addgroup will take a login_name as its first parameter. | 87 | * addgroup will take a login_name as its first parameter. |
82 | * | 88 | * |
83 | * gid | 89 | * gid can be customized via command-line parameters. |
84 | * | 90 | */ |
85 | * can be customized via command-line parameters. | ||
86 | * ________________________________________________________________________ */ | ||
87 | int addgroup_main(int argc, char **argv); | 91 | int addgroup_main(int argc, char **argv); |
88 | int addgroup_main(int argc, char **argv) | 92 | int addgroup_main(int argc, char **argv) |
89 | { | 93 | { |
@@ -103,6 +107,5 @@ int addgroup_main(int argc, char **argv) | |||
103 | bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); | 107 | bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); |
104 | } | 108 | } |
105 | 109 | ||
106 | /* werk */ | 110 | return addgroup(argv[0], gid, argv[1] ? argv[1] : ""); |
107 | return addgroup(argv[0], gid, (argv[1]) ? argv[1] : ""); | ||
108 | } | 111 | } |
diff --git a/loginutils/adduser.c b/loginutils/adduser.c index e0cdd1ced..4c03790d8 100644 --- a/loginutils/adduser.c +++ b/loginutils/adduser.c | |||
@@ -10,19 +10,21 @@ | |||
10 | 10 | ||
11 | #include "busybox.h" | 11 | #include "busybox.h" |
12 | 12 | ||
13 | #define DONT_SET_PASS (1 << 4) | 13 | #define OPT_DONT_SET_PASS (1 << 4) |
14 | #define DONT_MAKE_HOME (1 << 6) | 14 | #define OPT_DONT_MAKE_HOME (1 << 6) |
15 | 15 | ||
16 | 16 | ||
17 | /* remix */ | 17 | /* remix */ |
18 | /* EDR recoded such that the uid may be passed in *p */ | 18 | /* EDR recoded such that the uid may be passed in *p */ |
19 | static int passwd_study(const char *filename, struct passwd *p) | 19 | static int passwd_study(const char *filename, struct passwd *p) |
20 | { | 20 | { |
21 | struct passwd *pw; | 21 | enum { min = 500, max = 65000 }; |
22 | FILE *passwd; | 22 | FILE *passwd; |
23 | 23 | /* We are using reentrant fgetpwent_r() in order to avoid | |
24 | const int min = 500; | 24 | * pulling in static buffers from libc (think static build here) */ |
25 | const int max = 65000; | 25 | char buffer[256]; |
26 | struct passwd pw; | ||
27 | struct passwd *result; | ||
26 | 28 | ||
27 | passwd = xfopen(filename, "r"); | 29 | passwd = xfopen(filename, "r"); |
28 | 30 | ||
@@ -34,14 +36,14 @@ static int passwd_study(const char *filename, struct passwd *p) | |||
34 | * make sure login isn't taken; | 36 | * make sure login isn't taken; |
35 | * find free uid and gid; | 37 | * find free uid and gid; |
36 | */ | 38 | */ |
37 | while ((pw = fgetpwent(passwd))) { | 39 | while (!fgetpwent_r(passwd, &pw, buffer, sizeof(buffer), &result)) { |
38 | if (strcmp(pw->pw_name, p->pw_name) == 0) { | 40 | if (strcmp(pw.pw_name, p->pw_name) == 0) { |
39 | /* return 0; */ | 41 | /* return 0; */ |
40 | return 1; | 42 | return 1; |
41 | } | 43 | } |
42 | if ((pw->pw_uid >= p->pw_uid) && (pw->pw_uid < max) | 44 | if ((pw.pw_uid >= p->pw_uid) && (pw.pw_uid < max) |
43 | && (pw->pw_uid >= min)) { | 45 | && (pw.pw_uid >= min)) { |
44 | p->pw_uid = pw->pw_uid + 1; | 46 | p->pw_uid = pw.pw_uid + 1; |
45 | } | 47 | } |
46 | } | 48 | } |
47 | 49 | ||
@@ -85,7 +87,7 @@ static void passwd_wrapper(const char *login) | |||
85 | } | 87 | } |
86 | 88 | ||
87 | /* putpwent(3) remix */ | 89 | /* putpwent(3) remix */ |
88 | static int adduser(struct passwd *p, unsigned long flags) | 90 | static int adduser(struct passwd *p) |
89 | { | 91 | { |
90 | FILE *file; | 92 | FILE *file; |
91 | int addgroup = !p->pw_gid; | 93 | int addgroup = !p->pw_gid; |
@@ -130,7 +132,7 @@ static int adduser(struct passwd *p, unsigned long flags) | |||
130 | /* Clear the umask for this process so it doesn't | 132 | /* Clear the umask for this process so it doesn't |
131 | * * screw up the permissions on the mkdir and chown. */ | 133 | * * screw up the permissions on the mkdir and chown. */ |
132 | umask(0); | 134 | umask(0); |
133 | if (!(flags & DONT_MAKE_HOME)) { | 135 | if (!(option_mask32 & OPT_DONT_MAKE_HOME)) { |
134 | /* Set the owner and group so it is owned by the new user, | 136 | /* Set the owner and group so it is owned by the new user, |
135 | then fix up the permissions to 2755. Can't do it before | 137 | then fix up the permissions to 2755. Can't do it before |
136 | since chown will clear the setgid bit */ | 138 | since chown will clear the setgid bit */ |
@@ -141,7 +143,7 @@ static int adduser(struct passwd *p, unsigned long flags) | |||
141 | } | 143 | } |
142 | } | 144 | } |
143 | 145 | ||
144 | if (!(flags & DONT_SET_PASS)) { | 146 | if (!(option_mask32 & OPT_DONT_SET_PASS)) { |
145 | /* interactively set passwd */ | 147 | /* interactively set passwd */ |
146 | passwd_wrapper(p->pw_name); | 148 | passwd_wrapper(p->pw_name); |
147 | } | 149 | } |
@@ -163,7 +165,6 @@ int adduser_main(int argc, char **argv) | |||
163 | { | 165 | { |
164 | struct passwd pw; | 166 | struct passwd pw; |
165 | const char *usegroup = NULL; | 167 | const char *usegroup = NULL; |
166 | unsigned long flags; | ||
167 | 168 | ||
168 | /* got root? */ | 169 | /* got root? */ |
169 | if (geteuid()) { | 170 | if (geteuid()) { |
@@ -176,7 +177,7 @@ int adduser_main(int argc, char **argv) | |||
176 | 177 | ||
177 | /* check for min, max and missing args and exit on error */ | 178 | /* check for min, max and missing args and exit on error */ |
178 | opt_complementary = "-1:?1:?"; | 179 | opt_complementary = "-1:?1:?"; |
179 | flags = getopt32(argc, argv, "h:g:s:G:DSH", &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, &usegroup); | 180 | getopt32(argc, argv, "h:g:s:G:DSH", &pw.pw_dir, &pw.pw_gecos, &pw.pw_shell, &usegroup); |
180 | 181 | ||
181 | /* create string for $HOME if not specified already */ | 182 | /* create string for $HOME if not specified already */ |
182 | if (!pw.pw_dir) { | 183 | if (!pw.pw_dir) { |
@@ -191,5 +192,5 @@ int adduser_main(int argc, char **argv) | |||
191 | pw.pw_gid = usegroup ? xgroup2gid(usegroup) : 0; /* exits on failure */ | 192 | pw.pw_gid = usegroup ? xgroup2gid(usegroup) : 0; /* exits on failure */ |
192 | 193 | ||
193 | /* grand finale */ | 194 | /* grand finale */ |
194 | return adduser(&pw, flags); | 195 | return adduser(&pw); |
195 | } | 196 | } |
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 | ||
diff --git a/loginutils/sulogin.c b/loginutils/sulogin.c index 8e3095c87..38503f7b1 100644 --- a/loginutils/sulogin.c +++ b/loginutils/sulogin.c | |||
@@ -43,6 +43,12 @@ int sulogin_main(int argc, char **argv) | |||
43 | const char * const *p; | 43 | const char * const *p; |
44 | struct passwd *pwd; | 44 | struct passwd *pwd; |
45 | const char *shell; | 45 | const char *shell; |
46 | #if ENABLE_FEATURE_SHADOWPASSWDS | ||
47 | /* Using _r function to avoid pulling in static buffers */ | ||
48 | char buffer[256]; | ||
49 | struct spwd spw; | ||
50 | struct spwd *result; | ||
51 | #endif | ||
46 | 52 | ||
47 | logmode = LOGMODE_BOTH; | 53 | logmode = LOGMODE_BOTH; |
48 | openlog(applet_name, 0, LOG_AUTH); | 54 | openlog(applet_name, 0, LOG_AUTH); |
@@ -76,13 +82,10 @@ int sulogin_main(int argc, char **argv) | |||
76 | } | 82 | } |
77 | 83 | ||
78 | #if ENABLE_FEATURE_SHADOWPASSWDS | 84 | #if ENABLE_FEATURE_SHADOWPASSWDS |
79 | { | 85 | if (getspnam_r(pwd->pw_name, &spw, buffer, sizeof(buffer), &result)) { |
80 | struct spwd *spwd = getspnam(pwd->pw_name); | 86 | goto auth_error; |
81 | if (!spwd) { | ||
82 | goto auth_error; | ||
83 | } | ||
84 | pwd->pw_passwd = spwd->sp_pwdp; | ||
85 | } | 87 | } |
88 | pwd->pw_passwd = spw.sp_pwdp; | ||
86 | #endif | 89 | #endif |
87 | 90 | ||
88 | while (1) { | 91 | while (1) { |
diff --git a/scripts/objsizes b/scripts/objsizes index 44fbce1aa..09de11407 100755 --- a/scripts/objsizes +++ b/scripts/objsizes | |||
@@ -1,8 +1,19 @@ | |||
1 | #!/bin/sh | 1 | #!/bin/sh |
2 | 2 | ||
3 | printf "%9s %11s %9s %9s %s\n" "text+data" text+rodata rwdata bss filename | 3 | t_text=0 |
4 | t_data=0 | ||
5 | t_bss=0 | ||
6 | |||
7 | printf "%9s %11s %9s %9s %s\n" "text+data" "text+rodata" rwdata bss filename | ||
8 | |||
4 | find -name '*.o' | grep -v '^\./scripts/' | grep -vF built-in.o \ | 9 | find -name '*.o' | grep -v '^\./scripts/' | grep -vF built-in.o \ |
5 | | sed 's:^\./::' | xargs "${CROSS_COMPILE}size" | grep '^ *[0-9]' \ | 10 | | sed 's:^\./::' | xargs "${CROSS_COMPILE}size" | grep '^ *[0-9]' \ |
6 | | while read text data bss dec hex filename; do | 11 | | { |
12 | while read text data bss dec hex filename; do | ||
13 | t_text=$((t_text+text)) | ||
14 | t_data=$((t_data+data)) | ||
15 | t_bss=$((t_bss+bss)) | ||
7 | printf "%9d %11d %9d %9d %s\n" $((text+data)) $text $data $bss "$filename" | 16 | printf "%9d %11d %9d %9d %s\n" $((text+data)) $text $data $bss "$filename" |
8 | done | sort -r | 17 | done |
18 | printf "%9d %11d %9d %9d %s\n" $((t_text+t_data)) $t_text $t_data $t_bss "TOTAL" | ||
19 | } | sort -r | ||