tools: Fix handle leak in rfcomm
authorIldar Kamaletdinov <i.kamaletdinov@omp.ru>
Sat, 7 May 2022 17:35:04 +0000 (20:35 +0300)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 15 May 2023 09:25:54 +0000 (14:55 +0530)
Some branches of execution can make handle (socket) leakage.

Found by Linux Verification Center (linuxtesting.org) with the SVACE
static analysis tool.

Signed-off-by: Manika Shrivastava <manika.sh@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
tools/rfcomm.c

index c376395..fa337e6 100755 (executable)
@@ -297,6 +297,7 @@ static void cmd_connect(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **arg
 
                if (setsockopt(sk, SOL_SOCKET, SO_LINGER, &l, sizeof(l)) < 0) {
                        perror("Can't set linger option");
+                       close(sk);
                        return;
                }
        }
@@ -465,6 +466,7 @@ static void cmd_listen(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv
        if (getsockname(nsk, (struct sockaddr *)&laddr, &alen) < 0) {
                perror("Can't get RFCOMM socket name");
                close(nsk);
+               close(sk);
                return;
        }
 
@@ -474,6 +476,7 @@ static void cmd_listen(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv
                if (setsockopt(nsk, SOL_SOCKET, SO_LINGER, &l, sizeof(l)) < 0) {
                        perror("Can't set linger option");
                        close(nsk);
+                       close(sk);
                        return;
                }
        }
@@ -489,6 +492,7 @@ static void cmd_listen(int ctl, int dev, bdaddr_t *bdaddr, int argc, char **argv
        dev = ioctl(nsk, RFCOMMCREATEDEV, &req);
        if (dev < 0) {
                perror("Can't create RFCOMM TTY");
+               close(nsk);
                close(sk);
                return;
        }