[libvirt] [PATCH 1/2] util: virFileOpenAs interprets -1 as "current uid|gid"

Eric Blake eblake at redhat.com
Thu Jan 12 20:17:47 UTC 2012


On 01/12/2012 12:33 PM, Laine Stump wrote:
> [Oops. This is a prerequisite of the previous patch that I forgot to
> send. That patch should be 2/2 and this should be 1/2.]
> 
> This just simplifies use of virFileOpenAs a bit - if you're in a place
> where you don't have access to a different uid|gid, just give "-1".
> ---
>  src/libxl/libxl_driver.c      |    4 ++--
>  src/storage/storage_backend.c |    8 +++-----
>  src/util/util.c               |    4 ++++
>  3 files changed, 9 insertions(+), 7 deletions(-)

I like it; very much like chown()'s use of -1 to mean no change.  Alas,
I have a nit:

POSIX permits uid_t to be an unsigned short.  On implementations that
make that choice, casting (uid_t)-1 to an int gives 0xffff, rather than
-1, and comparison to -1 will fail.  In general, it is safest if you use
an explicit cast when comparing to a uid_t or gid_t value in any
arithmetic operation, since the act of comparing might include an
implicit conversion to int.

> 
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 0500ed0..d7325c3 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -216,7 +216,7 @@ libxlSaveImageOpen(libxlDriverPrivatePtr driver, const char *from,
>      libxlSavefileHeader hdr;
>      char *xml = NULL;
>  
> -    if ((fd = virFileOpenAs(from, O_RDONLY, 0, getuid(), getgid(), 0)) < 0) {
> +    if ((fd = virFileOpenAs(from, O_RDONLY, 0, -1, -1, 0)) < 0) {

This use is fine, since virFileOpenAs is explicitly typed as taking
uid_t and gid_t: -1 is always correctly promoted to uid_t or gid_t.

> +++ b/src/storage/storage_backend.c
> @@ -380,8 +380,6 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
>  {
>      int ret = -1;
>      int fd = -1;
> -    uid_t uid;
> -    gid_t gid;
>      int operation_flags;
>  
>      virCheckFlags(0, -1);
> @@ -393,15 +391,15 @@ virStorageBackendCreateRaw(virConnectPtr conn ATTRIBUTE_UNUSED,
>          goto cleanup;
>      }
>  
> -    uid = (vol->target.perms.uid == -1) ? getuid() : vol->target.perms.uid;
> -    gid = (vol->target.perms.gid == -1) ? getgid() : vol->target.perms.gid;

Here, perms.uid is an int (hmm, I wonder if we should fix that in
virStoragePerms in conf/storage_conf.h, since that fails on platforms
where uid_t is larger than an int - but that's a fix for another day).

> +++ b/src/util/util.c
> @@ -848,6 +848,10 @@ virFileOpenAs(const char *path, int openflags, mode_t mode,
>      int pair[2] = { -1, -1 };
>      int forkRet;
>  
> +    /* allow using -1 to mean "current value" */
> +    uid = (uid == -1) ? getuid() : uid;
> +    gid = (gid == -1) ? getgid() : gid;

But here, you have a bug - the use of == does type promotion to the
common type no smaller than int, which means you need an explicit cast:

uid = (uid == (uid_t) -1) ? getuid() : uid;

And that's repetitive enough that I'd probably write it:

if (uid == (uid_t) -1)
    uid = getuid();

Same for gid.

ACK with the 2 lines in util.c fixed.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120112/261c0dcb/attachment-0001.sig>


More information about the libvir-list mailing list