gtp-link: close sockets on error
Avoid resource leaks. Fixes: CID#347578, CID#347579 Change-Id: I9c437de9712ebe568528b4c9ee1e89a4ba5cd5d1
This commit is contained in:
parent
d489488a70
commit
7928152581
|
@ -80,16 +80,15 @@ static void setup_sockaddr_in6(struct sockaddr_in6 *sockaddr, struct in6_addr *i
|
||||||
|
|
||||||
static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
|
static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
|
||||||
{
|
{
|
||||||
int fd1 = socket(family, SOCK_DGRAM, 0);
|
|
||||||
int fd2 = socket(family, SOCK_DGRAM, 0);
|
|
||||||
int one = 1;
|
int one = 1;
|
||||||
|
|
||||||
if (fd1 < 0 || fd2 < 0)
|
gtp_sock->fd1 = socket(family, SOCK_DGRAM, 0);
|
||||||
|
gtp_sock->fd2 = socket(family, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
|
if (gtp_sock->fd1 < 0 || gtp_sock->fd2 < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
gtp_sock->family = family;
|
gtp_sock->family = family;
|
||||||
gtp_sock->fd1 = fd1;
|
|
||||||
gtp_sock->fd2 = fd2;
|
|
||||||
|
|
||||||
switch (family) {
|
switch (family) {
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
|
@ -105,9 +104,9 @@ static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
|
||||||
>p_sock->addr.v6, 3386);
|
>p_sock->addr.v6, 3386);
|
||||||
setup_sockaddr_in6(>p_sock->sockaddr.fd2.in6,
|
setup_sockaddr_in6(>p_sock->sockaddr.fd2.in6,
|
||||||
>p_sock->addr.v6, 2152);
|
>p_sock->addr.v6, 2152);
|
||||||
if (setsockopt(fd1, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0)
|
if (setsockopt(gtp_sock->fd1, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0)
|
||||||
perror("setsockopt IPV6_V6ONLY: ");
|
perror("setsockopt IPV6_V6ONLY: ");
|
||||||
if (setsockopt(fd2, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0)
|
if (setsockopt(gtp_sock->fd2, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one)) < 0)
|
||||||
perror("setsockopt IPV6_V6ONLY: ");
|
perror("setsockopt IPV6_V6ONLY: ");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -115,6 +114,19 @@ static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void close_socket(struct gtp_server_sock *gtp_sock)
|
||||||
|
{
|
||||||
|
if (gtp_sock->fd1 != -1) {
|
||||||
|
close(gtp_sock->fd1);
|
||||||
|
gtp_sock->fd1 = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gtp_sock->fd2 != -1) {
|
||||||
|
close(gtp_sock->fd2);
|
||||||
|
gtp_sock->fd2 = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char buf[MNL_SOCKET_BUFFER_SIZE];
|
char buf[MNL_SOCKET_BUFFER_SIZE];
|
||||||
|
@ -186,15 +198,18 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if (setup_socket(>p_sock, family) < 0) {
|
if (setup_socket(>p_sock, family) < 0) {
|
||||||
perror("socket");
|
perror("socket");
|
||||||
|
close_socket(>p_sock);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bind(gtp_sock.fd1, (struct sockaddr *) >p_sock.sockaddr.fd1, gtp_sock.len) < 0) {
|
if (bind(gtp_sock.fd1, (struct sockaddr *) >p_sock.sockaddr.fd1, gtp_sock.len) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
close_socket(>p_sock);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
if (bind(gtp_sock.fd2, (struct sockaddr *) >p_sock.sockaddr.fd2, gtp_sock.len) < 0) {
|
if (bind(gtp_sock.fd2, (struct sockaddr *) >p_sock.sockaddr.fd2, gtp_sock.len) < 0) {
|
||||||
perror("bind");
|
perror("bind");
|
||||||
|
close_socket(>p_sock);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,6 +219,7 @@ int main(int argc, char *argv[])
|
||||||
ret = gtp_dev_create(-1, argv[2], gtp_sock.fd1, gtp_sock.fd2);
|
ret = gtp_dev_create(-1, argv[2], gtp_sock.fd1, gtp_sock.fd2);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
perror("cannot create GTP device\n");
|
perror("cannot create GTP device\n");
|
||||||
|
close_socket(>p_sock);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue