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/addgroup.c | |
parent | c9c893d4f59418c50c8eb42bd80390026e123dd8 (diff) |
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/addgroup.c')
-rw-r--r-- | loginutils/addgroup.c | 45 |
1 files changed, 24 insertions, 21 deletions
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 @@ * return 1 on failure */ static int group_study(struct group *g) { + enum { max = 65000 }; FILE *etc_group; gid_t desired; - - struct group *grp; - const int max = 65000; + /* Using _r function to avoid static buffers pulled in */ + char buffer[256]; + struct group grp; + struct group *result; etc_group = xfopen(bb_path_group_file, "r"); /* make sure gr_name isn't taken, make sure gid is kosher */ desired = g->gr_gid; - while ((grp = fgetgrent(etc_group))) { - if ((strcmp(grp->gr_name, g->gr_name)) == 0) { + while (!fgetgrent_r(etc_group, &grp, buffer, sizeof(buffer), &result)) { + if ((strcmp(grp.gr_name, g->gr_name)) == 0) { bb_error_msg_and_die("%s: group already in use", g->gr_name); } - if ((desired) && grp->gr_gid == desired) { + if ((desired) && grp.gr_gid == desired) { bb_error_msg_and_die("%d: gid already in use", desired); } - if ((grp->gr_gid > g->gr_gid) && (grp->gr_gid < max)) { - g->gr_gid = grp->gr_gid; + if ((grp.gr_gid > g->gr_gid) && (grp.gr_gid < max)) { + g->gr_gid = grp.gr_gid; } } - fclose(etc_group); + if (ENABLE_FEATURE_CLEAN_UP) + fclose(etc_group); /* gid */ + g->gr_gid++; if (desired) { g->gr_gid = desired; - } else { - g->gr_gid++; } /* return 1; */ return 0; @@ -65,12 +67,16 @@ static int addgroup(char *group, gid_t gid, const char *user) file = xfopen(bb_path_group_file, "a"); /* group:passwd:gid:userlist */ fprintf(file, "%s:%s:%d:%s\n", group, "x", gr.gr_gid, user); - fclose(file); + if (ENABLE_FEATURE_CLEAN_UP) + fclose(file); #if ENABLE_FEATURE_SHADOWPASSWDS - file = xfopen(bb_path_gshadow_file, "a"); - fprintf(file, "%s:!::\n", group); - fclose(file); + file = fopen_or_warn(bb_path_gshadow_file, "a"); + if (file) { + fprintf(file, "%s:!::\n", group); + if (ENABLE_FEATURE_CLEAN_UP) + fclose(file); + } #endif /* return 1; */ @@ -80,10 +86,8 @@ static int addgroup(char *group, gid_t gid, const char *user) /* * addgroup will take a login_name as its first parameter. * - * gid - * - * can be customized via command-line parameters. - * ________________________________________________________________________ */ + * gid can be customized via command-line parameters. + */ int addgroup_main(int argc, char **argv); int addgroup_main(int argc, char **argv) { @@ -103,6 +107,5 @@ int addgroup_main(int argc, char **argv) bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); } - /* werk */ - return addgroup(argv[0], gid, (argv[1]) ? argv[1] : ""); + return addgroup(argv[0], gid, argv[1] ? argv[1] : ""); } |