aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Smith <osmith@sysmocom.de>2024-02-19 12:15:40 +0100
committerOliver Smith <osmith@sysmocom.de>2024-02-19 12:18:28 +0100
commit79281525818cd0b152a65862810cbc5c4b2f310c (patch)
treeaca9a625689246392ed97fd5a7f669050ce84237
parentd489488a704cc2e4cecccb72833f0b7f4f282a55 (diff)
gtp-link: close sockets on error
Avoid resource leaks. Fixes: CID#347578, CID#347579 Change-Id: I9c437de9712ebe568528b4c9ee1e89a4ba5cd5d1
-rw-r--r--tools/gtp-link.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/tools/gtp-link.c b/tools/gtp-link.c
index 0881f15..0b14bc5 100644
--- a/tools/gtp-link.c
+++ b/tools/gtp-link.c
@@ -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)
{
- int fd1 = socket(family, SOCK_DGRAM, 0);
- int fd2 = socket(family, SOCK_DGRAM, 0);
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;
gtp_sock->family = family;
- gtp_sock->fd1 = fd1;
- gtp_sock->fd2 = fd2;
switch (family) {
case AF_INET:
@@ -105,9 +104,9 @@ static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
&gtp_sock->addr.v6, 3386);
setup_sockaddr_in6(&gtp_sock->sockaddr.fd2.in6,
&gtp_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: ");
- 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: ");
break;
}
@@ -115,6 +114,19 @@ static int setup_socket(struct gtp_server_sock *gtp_sock, int family)
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[])
{
char buf[MNL_SOCKET_BUFFER_SIZE];
@@ -186,15 +198,18 @@ int main(int argc, char *argv[])
if (setup_socket(&gtp_sock, family) < 0) {
perror("socket");
+ close_socket(&gtp_sock);
exit(EXIT_FAILURE);
}
if (bind(gtp_sock.fd1, (struct sockaddr *) &gtp_sock.sockaddr.fd1, gtp_sock.len) < 0) {
perror("bind");
+ close_socket(&gtp_sock);
exit(EXIT_FAILURE);
}
if (bind(gtp_sock.fd2, (struct sockaddr *) &gtp_sock.sockaddr.fd2, gtp_sock.len) < 0) {
perror("bind");
+ close_socket(&gtp_sock);
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);
if (ret < 0) {
perror("cannot create GTP device\n");
+ close_socket(&gtp_sock);
exit(EXIT_FAILURE);
}