[libvirt] [PATCH 1/2] util: Keep errno set to the root error after when returning from virSetUIDGID
Laine Stump
laine at laine.org
Mon May 23 16:55:29 UTC 2011
On 05/22/2011 10:55 AM, Jiri Denemark wrote:
> ---
> src/util/util.c | 31 ++++++++++++++++++++-----------
> 1 files changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/src/util/util.c b/src/util/util.c
> index d1a08a6..0b4370b 100644
> --- a/src/util/util.c
> +++ b/src/util/util.c
> @@ -2889,17 +2889,20 @@ int virGetGroupID(const char *name,
>
> /* Set the real and effective uid and gid to the given values, and call
> * initgroups so that the process has all the assumed group membership of
> - * that uid. return 0 on success, -1 on failure.
> + * that uid. return 0 on success, -1 on failure (the original system error
> + * remains in errno).
> */
> int
> virSetUIDGID(uid_t uid, gid_t gid)
> {
> + int err;
> +
> if (gid> 0) {
> if (setregid(gid, gid)< 0) {
> - virReportSystemError(errno,
> + virReportSystemError(err = errno,
> _("cannot change to '%d' group"),
> (unsigned int) gid);
> - return -1;
> + goto error;
> }
> }
>
> @@ -2916,39 +2919,45 @@ virSetUIDGID(uid_t uid, gid_t gid)
>
> if (VIR_ALLOC_N(buf, bufsize)< 0) {
> virReportOOMError();
> - return -1;
> + err = ENOMEM;
> + goto error;
> }
> while ((rc = getpwuid_r(uid,&pwd, buf, bufsize,
> &pwd_result)) == ERANGE) {
> if (VIR_RESIZE_N(buf, bufsize, bufsize, bufsize)< 0) {
> virReportOOMError();
> VIR_FREE(buf);
> - return -1;
> + err = ENOMEM;
> + goto error;
> }
> }
> if (rc || !pwd_result) {
> - virReportSystemError(rc, _("cannot getpwuid_r(%d)"),
> + virReportSystemError(err = rc, _("cannot getpwuid_r(%d)"),
> (unsigned int) uid);
> VIR_FREE(buf);
> - return -1;
> + goto error;
> }
> if (initgroups(pwd.pw_name, pwd.pw_gid)< 0) {
> - virReportSystemError(errno,
> + virReportSystemError(err = errno,
> _("cannot initgroups(\"%s\", %d)"),
> pwd.pw_name, (unsigned int) pwd.pw_gid);
> VIR_FREE(buf);
> - return -1;
> + goto error;
> }
> VIR_FREE(buf);
> # endif
> if (setreuid(uid, uid)< 0) {
> - virReportSystemError(errno,
> + virReportSystemError(err = errno,
> _("cannot change to uid to '%d'"),
> (unsigned int) uid);
> - return -1;
> + goto error;
> }
> }
> return 0;
> +
> +error:
> + errno = err;
> + return -1;
> }
>
> #else /* HAVE_GETPWUID_R */
ACK.
More information about the libvir-list
mailing list