summaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorPeter Krempa <pkrempa@redhat.com>2012-08-28 16:51:05 +0200
committerPeter Krempa <pkrempa@redhat.com>2012-08-28 18:36:57 +0200
commitf2bb32b1d2443b74cdc6d482697332862adfc769 (patch)
tree3e0e68d6161bd9253bbba621c419a61e509fa1fc /src/util
parentconf: Fix the problem which cause libvirtd to crash (diff)
downloadlibvirt-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.c22
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;
}