[libvirt] [PATCH] initgroups() in qemudOpenAsUID()
Daniel P. Berrange
berrange at redhat.com
Mon Oct 18 09:47:21 UTC 2010
On Sun, Oct 17, 2010 at 10:58:55PM +0200, Dan Kenigsberg wrote:
> qemudOpenAsUID is intended to open a file with the credentials of a
> specified uid. Current implementation fails if the file is accessible to
> one of uid's groups but not owned by uid.
>
> This patch replaces the supplementary group list that the child process
> inherited from libvirtd with the default group list of uid.
> ---
> src/qemu/qemu_driver.c | 16 ++++++++++++++++
> 1 files changed, 16 insertions(+), 0 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 0ce2d40..a1027d4 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6353,6 +6353,7 @@ parent_cleanup:
> char *buf = NULL;
> size_t bufsize = 1024 * 1024;
> int bytesread;
> + struct passwd *pwd;
>
> /* child doesn't need the read side of the pipe */
> close(pipefd[0]);
> @@ -6365,6 +6366,21 @@ parent_cleanup:
> goto child_cleanup;
> }
>
> + /* we can avoid getpwuid_r() in threadless child */
> + if ((pwd = getpwuid(uid)) == NULL) {
That may be so, but you're going to hit a 'make syntax-check' failure
here, and we don't want to whitelist the entire qemu_driver.c file
to get past it.
> + exit_code = errno;
> + virReportSystemError(errno,
> + _("cannot setuid(%d) to read '%s'"),
> + uid, path);
> + goto child_cleanup;
> + }
> + if (initgroups(pwd->pw_name, pwd->pw_gid) != 0) {
> + exit_code = errno;
> + virReportSystemError(errno,
> + _("cannot setuid(%d) to read '%s'"),
> + uid, path);
> + goto child_cleanup;
> + }
> if (setuid(uid) != 0) {
> exit_code = errno;
> virReportSystemError(errno,
Regards,
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list