From a5f949165a0ede56dc45c67b92b98466f82e7140 Mon Sep 17 00:00:00 2001 From: nekral-guest Date: Sun, 10 Feb 2008 20:25:39 +0000 Subject: [PATCH] Fix the handling of -a when a user is being renamed (with -l). The new name of the user was used for the new supplementary groups, but not in the existing ones. --- ChangeLog | 6 ++++++ NEWS | 1 + src/usermod.c | 5 ++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 56c2ecb2..5d5929bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-02-10 Nicolas François + + * NEWS, src/usermod.c: Fix the handling of -a when a user is being + renamed (with -l). The new name of the user was used for the new + supplementary groups, but not in the existing ones. + 2008-02-10 Nicolas François * src/newusers.c: Set the shadow's password instead of the diff --git a/NEWS b/NEWS index 0d853b99..1aad2984 100644 --- a/NEWS +++ b/NEWS @@ -65,6 +65,7 @@ shadow-4.1.0 -> shadow-4.1.1 UNRELEASED one, no changes will be performed for that field. If no fields are changed, usermod will exist successfully with a warning. This avoids logging changes to syslog when there are actually no changes. + * Fix the handling of -a when a user is being renamed (with -l) - vipw/vigr * Recommend editing the shadowed (resp. regular) file if the regular (resp. shadowed) file was edited. diff --git a/src/usermod.c b/src/usermod.c index 5246650a..1ff4fc86 100644 --- a/src/usermod.c +++ b/src/usermod.c @@ -533,7 +533,8 @@ static void update_group (void) * concurrent groups. */ was_member = is_on_list (grp->gr_mem, user_name); - is_member = Gflg && is_on_list (user_groups, grp->gr_name); + is_member = Gflg && ( (was_member && aflg) + || is_on_list (user_groups, grp->gr_name)); if (!was_member && !is_member) continue; @@ -629,6 +630,8 @@ static void update_gshadow (void) * concurrent groups. */ is_member = Gflg && is_on_list (user_groups, sgrp->sg_name); + is_member = Gflg && ( (was_member && aflg) + || is_on_list (user_groups, sgrp->sg_name)); if (!was_member && !was_admin && !is_member) continue;