X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fupdate_passwd.c;h=a2be0f1552620597b3493a7081dc7988d799dbf8;hb=4c46d854690595bb2c5487aedccebab8de8aafda;hp=ba773fcb27fd2cc81ce4a478b66e3dcae20bc2ae;hpb=c6fb2a6b5fcece0ee4a7caf42cc344b5e0177822;p=oweals%2Fbusybox.git diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c index ba773fcb2..a2be0f155 100644 --- a/libbb/update_passwd.c +++ b/libbb/update_passwd.c @@ -11,7 +11,7 @@ * Modified to be able to add or delete users, groups and users to/from groups * by Tito Ragusa * - * Licensed under GPLv2, see file LICENSE in this tarball for details. + * Licensed under GPLv2, see file LICENSE in this source tree. */ #include "libbb.h" @@ -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+"); @@ -132,17 +133,12 @@ int FAST_FUNC update_passwd(const char *filename, goto close_old_fp; created: - if (!fstat(old_fd, &sb)) { + if (fstat(old_fd, &sb) == 0) { fchmod(new_fd, sb.st_mode & 0777); /* ignore errors */ fchown(new_fd, sb.st_uid, sb.st_gid); } errno = 0; - new_fp = fdopen(new_fd, "w"); - if (!new_fp) { - bb_perror_nomsg(); - close(new_fd); - goto unlink_new; - } + new_fp = xfdopen_for_write(new_fd); /* Backup file is "/etc/passwd-" */ *sfx_char = '-'; @@ -171,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; } @@ -230,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 */ @@ -243,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++; } } @@ -280,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; }