mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
DLM: fix memory leak in tcp_accept_from_sock()
The sk member of the socket generated by sock_create_kern() is overwritten by ops->accept(). So the previous sk will not be released. We use kernel_accept() instead of sock_create_kern() and ops->accept(). Signed-off-by: Tadashi Miyauchi <miyauchi@toshiba-tops.co.jp> Signed-off-by: Tsutomu Owa <tsutomu.owa@toshiba.co.jp> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
294e7e4587
commit
3421fb15be
1 changed files with 7 additions and 14 deletions
|
@ -732,22 +732,14 @@ static int tcp_accept_from_sock(struct connection *con)
|
|||
}
|
||||
mutex_unlock(&connections_lock);
|
||||
|
||||
memset(&peeraddr, 0, sizeof(peeraddr));
|
||||
result = sock_create_lite(dlm_local_addr[0]->ss_family,
|
||||
SOCK_STREAM, IPPROTO_TCP, &newsock);
|
||||
if (result < 0)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock_nested(&con->sock_mutex, 0);
|
||||
|
||||
result = -ENOTCONN;
|
||||
if (con->sock == NULL)
|
||||
goto accept_err;
|
||||
if (!con->sock) {
|
||||
mutex_unlock(&con->sock_mutex);
|
||||
return -ENOTCONN;
|
||||
}
|
||||
|
||||
newsock->type = con->sock->type;
|
||||
newsock->ops = con->sock->ops;
|
||||
|
||||
result = con->sock->ops->accept(con->sock, newsock, O_NONBLOCK, true);
|
||||
result = kernel_accept(con->sock, &newsock, O_NONBLOCK);
|
||||
if (result < 0)
|
||||
goto accept_err;
|
||||
|
||||
|
@ -844,6 +836,7 @@ static int tcp_accept_from_sock(struct connection *con)
|
|||
|
||||
accept_err:
|
||||
mutex_unlock(&con->sock_mutex);
|
||||
if (newsock)
|
||||
sock_release(newsock);
|
||||
|
||||
if (result != -EAGAIN)
|
||||
|
|
Loading…
Reference in a new issue