pkgsrc-Users archive


handling of new user/group additions in binary packages is broken

Handling of new user/group additions from binary packages is broken
w.r.t. the file ownerships given within binary archives, and it is
effectively broken in its design.

Currently it is inevitable that user and group names will end up with
different uid/gid values on target install systems, i.e. production
systems which are not "pristine" (just freshly installed), and where the
package does not specify explicit uid/gid values (and if it does then
uid/gid conflicts are likely).

The problem is that the binary archive file is fully extracted _before_
the username/groupname is created thus even though it contains both the
username and the uid (groupname and the gid) only the uid/gid numeric
values can ever be used.  If the id number given in the archive is
already in use on the target system for an unrelated user then the file
will end up being owned by the existing group or user, then the expected
user and/or group will be created, but with a new uid/gid, and the file
will not have its ownership updated to match the new username/groupname.

Partly this is further exacerbated (i.e. made more likely) by the fact
that there is no way within pkgsrc to reserve a range of id numbers
explicitly for the use of packages (i.e. make use of the
useradd/groupadd '-r' option) -- ordinary user accounts will be created
by the local admin in the same range as accounts for packages will be
created on the build system.  The build system, being what it is, will
not usually have the same local user accounts as production systems, and
may not even be operated by the same organization.

Previously I've mostly worked around it by carefully testing each
package build by hand and then ensuring all necessary users and groups
are manually (pre)installed on all my systems for all the packages I
normally build.  However I'm now upgrading packages often enough on
production systems where it is not easy to continue to always manually
pre-add all the new package-specific users and groups needed.  To some
extent I've been able to modify package modules to use specific UID/GID
values that I'm reasonably certain will be outside the range of normal
local users on all the systems I build packages for, but this doesn't
always work, especially when I miss checking some dependent package
which requires a new user and/or group.

The ideal solution would be to _never_ rely on the ownerships in the
binary package archive files and instead use the PLIST file exclusively
to set ownerships of all files (which need non-standard ownerships (and
permissions too?)) via a generated MTREE file (and I think this was the
intent of MTREE files in the original pkg_install design), but of course
that would likely require far more maintenance overhead for package
modules, at least for those which do require special users and/or

The hack would be to extract just the package meta files first, then run
the require(YES!) and pre-install scripts (thus creating any necessary
users and groups with appropriate conflict checking), _then_ finally
extract the rest of the archive thus allowing pax to change the
ownership of extracted files to match the owner IDs on the target
system.  This breaks though if the package has internal knowledge of any
uid/gid numbers (even though that should be a bug by definition).

In any case though it would be _extremely_ valuable to make use of the
useradd/groupadd '-r' options (where available), and to make sure to do
so on the _target_ system too, not just the build system!  I don't know
what to do about systems which do not support such a feature, but which
do have otherwise sufficient and/or necessary platform specific
useradd/groupadd tools.  (In my local changes to a much earlier version
of pkgsrc I had some hacks to use '-r' on the build system, but they
weren't designed properly for binary packages either -- they avoided the
issues only by accident, not by design.)

                                                Greg A. Woods
                                                Planix, Inc.

<>       +1 416 218-0099

Attachment: pgpTnlLhr1lob.pgp
Description: PGP signature

Home | Main Index | Thread Index | Old Index