cgmanager chown: close socketpair on error paths

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
This commit is contained in:
Serge Hallyn 2014-01-29 17:31:49 +00:00 committed by Stéphane Graber
parent beebf12bbf
commit 5c8a9fc62d

View File

@ -167,7 +167,7 @@ struct chown_data {
static int do_chown_cgroup(const char *controller, const char *cgroup_path) 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]; char buf[1];
if (setgid(0) < 0) if (setgid(0) < 0)
@ -177,20 +177,20 @@ static int do_chown_cgroup(const char *controller, const char *cgroup_path)
if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sv) < 0) { if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sv) < 0) {
SYSERROR("Error creating socketpair"); SYSERROR("Error creating socketpair");
return -1; goto out;
} }
if (setsockopt(sv[1], SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) { if (setsockopt(sv[1], SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) {
SYSERROR("setsockopt failed"); SYSERROR("setsockopt failed");
return -1; goto out;
} }
if (setsockopt(sv[0], SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) { if (setsockopt(sv[0], SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)) == -1) {
SYSERROR("setsockopt failed"); SYSERROR("setsockopt failed");
return -1; goto out;
} }
if ( cgmanager_chown_scm_sync(NULL, cgroup_manager, controller, if ( cgmanager_chown_scm_sync(NULL, cgroup_manager, controller,
cgroup_path, sv[1]) != 0) { cgroup_path, sv[1]) != 0) {
ERROR("call to cgmanager_chown_scm_sync failed"); ERROR("call to cgmanager_chown_scm_sync failed");
return -1; goto out;
} }
/* now send credentials */ /* now send credentials */
@ -199,37 +199,38 @@ static int do_chown_cgroup(const char *controller, const char *cgroup_path)
FD_SET(sv[0], &rfds); FD_SET(sv[0], &rfds);
if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) { if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) {
ERROR("Error getting go-ahead from server: %s", strerror(errno)); ERROR("Error getting go-ahead from server: %s", strerror(errno));
return -1; goto out;
} }
if (read(sv[0], &buf, 1) != 1) { if (read(sv[0], &buf, 1) != 1) {
ERROR("Error getting reply from server over socketpair"); ERROR("Error getting reply from server over socketpair");
return -1; goto out;
} }
if (send_creds(sv[0], getpid(), getuid(), getgid())) { if (send_creds(sv[0], getpid(), getuid(), getgid())) {
ERROR("Error sending pid over SCM_CREDENTIAL"); ERROR("Error sending pid over SCM_CREDENTIAL");
return -1; goto out;
} }
FD_ZERO(&rfds); FD_ZERO(&rfds);
FD_SET(sv[0], &rfds); FD_SET(sv[0], &rfds);
if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) { if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) {
ERROR("Error getting go-ahead from server: %s", strerror(errno)); ERROR("Error getting go-ahead from server: %s", strerror(errno));
return -1; goto out;
} }
if (read(sv[0], &buf, 1) != 1) { if (read(sv[0], &buf, 1) != 1) {
ERROR("Error getting reply from server over socketpair"); ERROR("Error getting reply from server over socketpair");
return -1; goto out;
} }
if (send_creds(sv[0], getpid(), 0, 0)) { if (send_creds(sv[0], getpid(), 0, 0)) {
ERROR("Error sending pid over SCM_CREDENTIAL"); ERROR("Error sending pid over SCM_CREDENTIAL");
return -1; goto out;
} }
FD_ZERO(&rfds); FD_ZERO(&rfds);
FD_SET(sv[0], &rfds); FD_SET(sv[0], &rfds);
if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) { if (select(sv[0]+1, &rfds, NULL, NULL, NULL) < 0) {
ERROR("Error getting go-ahead from server: %s", strerror(errno)); 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[0]);
close(sv[1]); close(sv[1]);
if (ret == 1 && *buf == '1') if (ret == 1 && *buf == '1')