Commit ae99f539 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

page-xfer: close sockets on errror paths

CID 996195 (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_handle: Handle variable ask going out of scope leaks the handle.

CID 996196 (#3 of 3): Resource leak (RESOURCE_LEAK)
10. leaked_handle: Handle variable sk going out of scope leaks the handle.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 5a61a509
...@@ -99,8 +99,11 @@ static int page_server_add(int sk, struct page_server_iov *pi) ...@@ -99,8 +99,11 @@ static int page_server_add(int sk, struct page_server_iov *pi)
static int page_server_serve(int sk) static int page_server_serve(int sk)
{ {
int ret = -1;
if (pipe(cxfer.p)) { if (pipe(cxfer.p)) {
pr_perror("Can't make pipe for xfer"); pr_perror("Can't make pipe for xfer");
close(sk);
return -1; return -1;
} }
...@@ -108,7 +111,6 @@ static int page_server_serve(int sk) ...@@ -108,7 +111,6 @@ static int page_server_serve(int sk)
pr_debug("Created xfer pipe size %u\n", cxfer.pipe_size); pr_debug("Created xfer pipe size %u\n", cxfer.pipe_size);
while (1) { while (1) {
int ret;
struct page_server_iov pi; struct page_server_iov pi;
ret = read(sk, &pi, sizeof(pi)); ret = read(sk, &pi, sizeof(pi));
...@@ -117,7 +119,8 @@ static int page_server_serve(int sk) ...@@ -117,7 +119,8 @@ static int page_server_serve(int sk)
if (ret != sizeof(pi)) { if (ret != sizeof(pi)) {
pr_perror("Can't read pagemap from socket"); pr_perror("Can't read pagemap from socket");
return -1; ret = -1;
break;
} }
switch (pi.cmd) { switch (pi.cmd) {
...@@ -131,16 +134,18 @@ static int page_server_serve(int sk) ...@@ -131,16 +134,18 @@ static int page_server_serve(int sk)
} }
if (ret) if (ret)
return -1; break;
} }
pr_info("Session over\n"); pr_info("Session over\n");
return 0;
close(sk);
return ret;
} }
int cr_page_server(void) int cr_page_server(void)
{ {
int sk, ask; int sk, ask = -1;
struct sockaddr_in caddr; struct sockaddr_in caddr;
socklen_t clen = sizeof(caddr); socklen_t clen = sizeof(caddr);
...@@ -158,22 +163,24 @@ int cr_page_server(void) ...@@ -158,22 +163,24 @@ int cr_page_server(void)
opts.ps_addr.sin_family = AF_INET; opts.ps_addr.sin_family = AF_INET;
if (bind(sk, (struct sockaddr *)&opts.ps_addr, sizeof(opts.ps_addr))) { if (bind(sk, (struct sockaddr *)&opts.ps_addr, sizeof(opts.ps_addr))) {
pr_perror("Can't bind page server\n"); pr_perror("Can't bind page server\n");
return -1; goto out;
} }
if (listen(sk, 1)) { if (listen(sk, 1)) {
pr_perror("Can't listen on page server socket"); pr_perror("Can't listen on page server socket");
return -1; goto out;
} }
ask = accept(sk, (struct sockaddr *)&caddr, &clen); ask = accept(sk, (struct sockaddr *)&caddr, &clen);
if (ask < 0) { if (ask < 0)
pr_perror("Can't accept connection to server"); pr_perror("Can't accept connection to server");
return -1;
}
out:
close(sk); close(sk);
if (ask < 0)
return -1;
pr_info("Accepted connection from %s:%u\n", pr_info("Accepted connection from %s:%u\n",
inet_ntoa(caddr.sin_addr), inet_ntoa(caddr.sin_addr),
(int)ntohs(caddr.sin_port)); (int)ntohs(caddr.sin_port));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment