Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Jan 2014 19:52:42 GMT
From:      Jason Edwards <sub.mesa@gmail.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   bin/185666: Regression for 'pw usermod <user> -G <grouplist>'
Message-ID:  <201401111952.s0BJqgx4053805@oldred.freebsd.org>
Resent-Message-ID: <201401112000.s0BK00tH017995@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         185666
>Category:       bin
>Synopsis:       Regression for 'pw usermod <user> -G <grouplist>'
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Jan 11 20:00:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Jason Edwards
>Release:        10.0-RC3
>Organization:
ZFSguru
>Environment:
FreeBSD zfsguru.bsd 10.0-RC3 FreeBSD 10.0-RC3 #0: Tue Dec 24 02:57:59 UTC 2013     jason@zfsguru:/usr/obj/tmpfs/2-source/sys/OFED-POLLING-ALTQ  amd64
>Description:
The pw(8) manpage states:

     -G grouplist  Set additional group memberships for an account.  grouplist
                   is a comma, space or tab-separated list of group names or
                   group numbers.  The user's name is added to the group lists
                   in /etc/group, and removed from any groups not specified in
                   grouplist.

This works as expected on FreeBSD 9.2-RELEASE where the user is removed from any groups not specified explicitly in the -G grouplist. However, on 10.0-RC1 and 10.0-RC3, I can reproduce 100% a regression where the username is *NOT* removed from the 'old group'. It is only added to the new group.
>How-To-Repeat:
It works as expected on 9.2:

pw useradd testuser
pw groupadd testgroup
pw groupadd testgroup2
pw usermod testuser -G testgroup

# /etc/group section before:
# testuser:*:1001:
# testgroup:*:1002:testuser
# testgroup2:*:1003:

pw usermod testuser -G testgroup2

# /etc/group section after:
# testuser:*:1001:
# testgroup:*:1002:
# testgroup2:*:1003:testuser

However, on 10.0-RC1 and 10.0-RC3 amd64 the behavior is very different; it does not remove the 'old group':

pw useradd testuser
pw groupadd testgroup
pw groupadd testgroup2
pw usermod testuser -G testgroup

# /etc/group section before:
# testuser:*:1004:
# testgroup:*:1005:testuser
# testgroup2:*:1006:

pw usermod testuser -G testgroup2

# /etc/group section after:
# testuser:*:1004:
# testgroup:*:1005:testuser
# testgroup2:*:1006:testuser
>Fix:
Workaround is to use 'groupmod' instead, to achieve a rough equivalent:

# remove <username> from the group <oldgroup>
pw groupmod <oldgroup> -d <username>
# add <username> to the group <newgroup>
pw groupmod <newgroup> -m <username>

Of course, the usermod -G command is superior, because it removes the user from all groups not specified explicitly.

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401111952.s0BJqgx4053805>