diff options
author | Peter Krempa <pkrempa@redhat.com> | 2012-08-28 16:51:05 +0200 |
---|---|---|
committer | Peter Krempa <pkrempa@redhat.com> | 2012-08-28 18:36:57 +0200 |
commit | f2bb32b1d2443b74cdc6d482697332862adfc769 (patch) | |
tree | 3e0e68d6161bd9253bbba621c419a61e509fa1fc /src/util | |
parent | conf: Fix the problem which cause libvirtd to crash (diff) | |
download | libvirt-f2bb32b1d2443b74cdc6d482697332862adfc769.tar.gz libvirt-f2bb32b1d2443b74cdc6d482697332862adfc769.tar.bz2 libvirt-f2bb32b1d2443b74cdc6d482697332862adfc769.zip |
util: Fix error message when getpwuid_r fails to find the user
getpwuid_r returns success but sets the return structure to NULL when it
fails to deliver data about the requested uid. In our helper code this
created following strange error messages:
" ... cannot getpwuid_r(1234): Success"
This patch creates a more helpful message:
" ... getpwuid_r failed to retrieve data for uid '1234'"
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/util.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/util/util.c b/src/util/util.c index 9068e0ff3..91eab7210 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -2629,6 +2629,7 @@ int virSetUIDGID(uid_t uid, gid_t gid) { int err; + char *buf = NULL; if (gid > 0) { if (setregid(gid, gid) < 0) { @@ -2642,7 +2643,6 @@ virSetUIDGID(uid_t uid, gid_t gid) if (uid > 0) { # ifdef HAVE_INITGROUPS struct passwd pwd, *pwd_result; - char *buf = NULL; size_t bufsize; int rc; @@ -2659,25 +2659,32 @@ virSetUIDGID(uid_t uid, gid_t gid) &pwd_result)) == ERANGE) { if (VIR_RESIZE_N(buf, bufsize, bufsize, bufsize) < 0) { virReportOOMError(); - VIR_FREE(buf); err = ENOMEM; goto error; } } - if (rc || !pwd_result) { + + if (rc) { virReportSystemError(err = rc, _("cannot getpwuid_r(%d)"), (unsigned int) uid); - VIR_FREE(buf); goto error; } + + if (!pwd_result) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("getpwuid_r failed to retrieve data " + "for uid '%d'"), + (unsigned int) uid); + err = EINVAL; + goto error; + } + if (initgroups(pwd.pw_name, pwd.pw_gid) < 0) { virReportSystemError(err = errno, _("cannot initgroups(\"%s\", %d)"), pwd.pw_name, (unsigned int) pwd.pw_gid); - VIR_FREE(buf); goto error; } - VIR_FREE(buf); # endif if (setreuid(uid, uid) < 0) { virReportSystemError(err = errno, @@ -2686,9 +2693,12 @@ virSetUIDGID(uid_t uid, gid_t gid) goto error; } } + + VIR_FREE(buf); return 0; error: + VIR_FREE(buf); errno = err; return -1; } |