[lxc-devel] [PATCH] cgmanager chown: close socketpair on error paths
Stéphane Graber
stgraber at ubuntu.com
Wed Jan 29 19:16:14 UTC 2014
On Wed, Jan 29, 2014 at 05:31:49PM +0000, Serge Hallyn wrote:
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
Acked-by: Stéphane Graber <stgraber at ubuntu.com>
> ---
> src/lxc/cgmanager.c | 27 ++++++++++++++-------------
> 1 file changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/src/lxc/cgmanager.c b/src/lxc/cgmanager.c
> index 797e2ae..6ff7f32 100644
> --- a/src/lxc/cgmanager.c
> +++ b/src/lxc/cgmanager.c
> @@ -168,7 +168,7 @@ struct chown_data {
>
> static int do_chown_cgroup(const char *controller, const char *cgroup_path)
> {
> - int sv[2] = {-1, -1}, optval = 1;
> + int sv[2] = {-1, -1}, optval = 1, ret = -1;
> char buf[1];
>
> if (setgid(0) < 0)
> @@ -178,20 +178,20 @@ static int do_chown_cgroup(const char *controller, const char *cgroup_path)
>
> if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sv) < 0) {
> SYSERROR("Error creating socketpair");
> - return -1;
> + goto out;
> }
> if (setsockopt(sv[1], SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) {
> SYSERROR("setsockopt failed");
> - return -1;
> + goto out;
> }
> if (setsockopt(sv[0], SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) {
> SYSERROR("setsockopt failed");
> - return -1;
> + goto out;
> }
> if ( cgmanager_chown_scm_sync(NULL, cgroup_manager, controller,
> cgroup_path, sv[1]) != 0) {
> ERROR("call to cgmanager_chown_scm_sync failed");
> - return -1;
> + goto out;
> }
> /* now send credentials */
>
> @@ -200,37 +200,38 @@ static int do_chown_cgroup(const char *controller, const char *cgroup_path)
> FD_SET(sv[0], &rfds);
> if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) {
> ERROR("Error getting go-ahead from server: %s", strerror(errno));
> - return -1;
> + goto out;
> }
> if (read(sv[0], &buf, 1) != 1) {
> ERROR("Error getting reply from server over socketpair");
> - return -1;
> + goto out;
> }
> if (send_creds(sv[0], getpid(), getuid(), getgid())) {
> ERROR("Error sending pid over SCM_CREDENTIAL");
> - return -1;
> + goto out;
> }
> FD_ZERO(&rfds);
> FD_SET(sv[0], &rfds);
> if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) {
> ERROR("Error getting go-ahead from server: %s", strerror(errno));
> - return -1;
> + goto out;
> }
> if (read(sv[0], &buf, 1) != 1) {
> ERROR("Error getting reply from server over socketpair");
> - return -1;
> + goto out;
> }
> if (send_creds(sv[0], getpid(), 0, 0)) {
> ERROR("Error sending pid over SCM_CREDENTIAL");
> - return -1;
> + goto out;
> }
> FD_ZERO(&rfds);
> FD_SET(sv[0], &rfds);
> if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) {
> ERROR("Error getting go-ahead from server: %s", strerror(errno));
> - return -1;
> + goto out;
> }
> - int ret = read(sv[0], buf, 1);
> + ret = read(sv[0], buf, 1);
> +out:
> close(sv[0]);
> close(sv[1]);
> if (ret == 1 && *buf == '1')
> --
> 1.8.5.3
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
--
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140129/167b1eda/attachment.pgp>
More information about the lxc-devel
mailing list