diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/update_passwd.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c index 301893be1..f5ce1f955 100644 --- a/libbb/update_passwd.c +++ b/libbb/update_passwd.c @@ -81,6 +81,7 @@ int FAST_FUNC update_passwd(const char *filename, FILE *new_fp; char *fnamesfx; char *sfx_char; + char *name_colon; unsigned user_len; int old_fd; int new_fd; @@ -103,8 +104,8 @@ int FAST_FUNC update_passwd(const char *filename, /* New passwd file, "/etc/passwd+" for now */ fnamesfx = xasprintf("%s+", filename); sfx_char = &fnamesfx[strlen(fnamesfx)-1]; - name = xasprintf("%s:", name); - user_len = strlen(name); + name_colon = xasprintf("%s:", name); + user_len = strlen(name_colon); if (shadow) old_fp = fopen(filename, "r+"); @@ -166,7 +167,7 @@ int FAST_FUNC update_passwd(const char *filename, line = xmalloc_fgetline(old_fp); if (!line) /* EOF/error */ break; - if (strncmp(name, line, user_len) != 0) { + if (strncmp(name_colon, line, user_len) != 0) { fprintf(new_fp, "%s\n", line); goto next; } @@ -225,11 +226,11 @@ int FAST_FUNC update_passwd(const char *filename, /* move past old change date */ cp = strchrnul(cp + 1, ':'); /* "name:" + "new_passwd" + ":" + "change date" + ":rest of line" */ - fprintf(new_fp, "%s%s:%u%s\n", name, new_passwd, + fprintf(new_fp, "%s%s:%u%s\n", name_colon, new_passwd, (unsigned)(time(NULL)) / (24*60*60), cp); } else { /* "name:" + "new_passwd" + ":rest of line" */ - fprintf(new_fp, "%s%s%s\n", name, new_passwd, cp); + fprintf(new_fp, "%s%s%s\n", name_colon, new_passwd, cp); } changed_lines++; } /* else delete user or group: skip the line */ @@ -238,15 +239,19 @@ int FAST_FUNC update_passwd(const char *filename, } if (changed_lines == 0) { -#if ENABLE_FEATURE_DEL_USER_FROM_GROUP - if (member) - bb_error_msg("can't find %s in %s", member, filename); +#if ENABLE_FEATURE_ADDUSER_TO_GROUP || ENABLE_FEATURE_DEL_USER_FROM_GROUP + if (member) { + if (ENABLE_ADDGROUP && applet_name[0] == 'a') + bb_error_msg("can't find %s in %s", name, filename); + if (ENABLE_DELGROUP && applet_name[0] == 'd') + bb_error_msg("can't find %s in %s", member, filename); + } #endif if ((ENABLE_ADDUSER || ENABLE_ADDGROUP) && applet_name[0] == 'a' && !member ) { /* add user or group */ - fprintf(new_fp, "%s%s\n", name, new_passwd); + fprintf(new_fp, "%s%s\n", name_colon, new_passwd); changed_lines++; } } @@ -275,6 +280,6 @@ int FAST_FUNC update_passwd(const char *filename, free_mem: free(fnamesfx); free((char *)filename); - free((char *)name); + free(name_colon); return ret; } |