osmith has submitted this change. ( 
https://gerrit.osmocom.org/c/libgtpnl/+/36017?usp=email )

Change subject: gtp-link: close sockets on error
......................................................................

gtp-link: close sockets on error

Avoid resource leaks.

Fixes: CID#347578, CID#347579
Change-Id: I9c437de9712ebe568528b4c9ee1e89a4ba5cd5d1
---
M tools/gtp-link.c
1 file changed, 35 insertions(+), 7 deletions(-)

Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, but someone else must approve
  fixeria: Looks good to me, approved




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 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 @@
                                   &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 @@
        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 @@

        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 @@
                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);
        }


--
To view, visit https://gerrit.osmocom.org/c/libgtpnl/+/36017?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libgtpnl
Gerrit-Branch: master
Gerrit-Change-Id: I9c437de9712ebe568528b4c9ee1e89a4ba5cd5d1
Gerrit-Change-Number: 36017
Gerrit-PatchSet: 1
Gerrit-Owner: osmith <osm...@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanits...@sysmocom.de>
Gerrit-Reviewer: osmith <osm...@sysmocom.de>
Gerrit-Reviewer: pespin <pes...@sysmocom.de>
Gerrit-MessageType: merged

Reply via email to