[prev in list] [next in list] [prev in thread] [next in thread]
List: busybox
Subject: Re: Bug in the deluser applet
From: Laszlo Papp <lpapp () kde ! org>
Date: 2015-02-19 18:16:38
Message-ID: CAOMwXhM-mp6H3dhgY5U9KMqiZThXMzMJmE--bsE8r8hr8hZoaw () mail ! gmail ! com
[Download RAW message or body]
From b03ad793d1188148953fa280dda672229b9a6524 Mon Sep 17 00:00:00 2001
From: Laszlo Papp <laszlo.papp@polatis.com>
Date: Wed, 18 Feb 2015 15:20:58 +0000
Subject: [PATCH] Delete the user from all the groups for user deletion
---
libbb/update_passwd.c | 57 +++++++++++++++++++++++++++++++++++----------------
loginutils/deluser.c | 4 +++-
2 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/libbb/update_passwd.c b/libbb/update_passwd.c
index a30af6f..df544f0 100644
--- a/libbb/update_passwd.c
+++ b/libbb/update_passwd.c
@@ -62,6 +62,8 @@ static void check_selinux_update_passwd(const char *username)
only if CONFIG_PASSWD=y and applet_name[0] == 'p' like in passwd
or if CONFIG_CHPASSWD=y and applet_name[0] == 'c' like in chpasswd
+ 8) delete a user from all groups : update_passwd(FILE, NULL, NULL, MEMBER)
+
This function does not validate the arguments fed to it
so the calling program should take care of that.
@@ -81,7 +83,7 @@ int FAST_FUNC update_passwd(const char *filename,
FILE *new_fp;
char *fnamesfx;
char *sfx_char;
- char *name_colon;
+ char *name_colon = 0;
unsigned user_len;
int old_fd;
int new_fd;
@@ -99,13 +101,15 @@ int FAST_FUNC update_passwd(const char *filename,
if (filename == NULL)
return ret;
- check_selinux_update_passwd(name);
+ if (name) check_selinux_update_passwd(name);
/* New passwd file, "/etc/passwd+" for now */
fnamesfx = xasprintf("%s+", filename);
sfx_char = &fnamesfx[strlen(fnamesfx)-1];
- name_colon = xasprintf("%s:", name);
- user_len = strlen(name_colon);
+ if (name) {
+ name_colon = xasprintf("%s:", name);
+ user_len = strlen(name_colon);
+ }
if (shadow)
old_fp = fopen(filename, "r+");
@@ -162,21 +166,38 @@ int FAST_FUNC update_passwd(const char *filename,
/* Read current password file, write updated /etc/passwd+ */
changed_lines = 0;
while (1) {
- char *cp, *line;
-
- line = xmalloc_fgetline(old_fp);
- if (!line) /* EOF/error */
- break;
- if (strncmp(name_colon, line, user_len) != 0) {
- fprintf(new_fp, "%s\n", line);
- goto next;
- }
-
- /* We have a match with "name:"... */
- cp = line + user_len; /* move past name: */
+ char *cp, *line;
+ if (!name && member) {
+ struct group* g;
+ if ((g = getgrent())) {
+ char gline[LINE_MAX];
+ char **s= g->gr_mem;
+ bool sep = false;
+ snprintf(gline, sizeof(gline), "%s:%s:%i:",
g->gr_name, g->gr_passwd, g->gr_gid);
+ while (*s) {
+ if (strcmp(*s, member)) { if (sep) strcat(gline,
","); else sep = true; strcat(gline, *s); }
+ ++s;
+ }
+ fprintf(new_fp, "%s\n", gline);
+ continue;
+ } else {
+ break;
+ }
+ } else {
+ line = xmalloc_fgetline(old_fp);
+ if (!line) /* EOF/error */
+ break;
+ if (!name_colon || strncmp(name_colon, line, user_len) != 0) {
+ fprintf(new_fp, "%s\n", line);
+ goto next;
+ }
+
+ /* We have a match with "name:"... */
+ cp = line + user_len; /* move past name: */
+ }
#if ENABLE_FEATURE_ADDUSER_TO_GROUP || ENABLE_FEATURE_DEL_USER_FROM_GROUP
- if (member) {
+ if (name && member) {
/* It's actually /etc/group+, not /etc/passwd+ */
if (ENABLE_FEATURE_ADDUSER_TO_GROUP
&& applet_name[0] == 'a'
@@ -240,7 +261,7 @@ int FAST_FUNC update_passwd(const char *filename,
if (changed_lines == 0) {
#if ENABLE_FEATURE_ADDUSER_TO_GROUP || ENABLE_FEATURE_DEL_USER_FROM_GROUP
- if (member) {
+ if (name && 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')
diff --git a/loginutils/deluser.c b/loginutils/deluser.c
index 01a9386..a3f5f3a 100644
--- a/loginutils/deluser.c
+++ b/loginutils/deluser.c
@@ -82,6 +82,9 @@ int deluser_main(int argc, char **argv)
do_delgroup:
/* "delgroup GROUP" or "delgroup USER GROUP" */
if (do_deluser < 0) { /* delgroup after deluser? */
+ pfile = bb_path_group_file;
+ if (update_passwd(pfile, NULL, NULL, name) == -1)
+ return EXIT_FAILURE;
gr = getgrnam(name);
if (!gr)
return EXIT_SUCCESS;
@@ -99,7 +102,6 @@ int deluser_main(int argc, char **argv)
}
//endpwent();
}
- pfile = bb_path_group_file;
if (ENABLE_FEATURE_SHADOWPASSWDS)
sfile = bb_path_gshadow_file;
}
--
2.3.0
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic