diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2021-09-27 00:28:24 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2021-09-27 01:28:02 +0200 |
commit | f004de4a9d29f65e14a542e42dc40b9628e936d4 (patch) | |
tree | d9cbd497407872912d4333ad51ad303fe3a51509 /tap.c | |
parent | f1c1d40f907d4f9a83508b9e7082c60b08d5090c (diff) | |
download | passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.tar passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.tar.gz passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.tar.bz2 passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.tar.lz passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.tar.xz passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.tar.zst passt-f004de4a9d29f65e14a542e42dc40b9628e936d4.zip |
tap: Don't leak file descriptor used to bring up loopback interface
...and while at it, set the socket as non-blocking directly on open().
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tap.c')
-rw-r--r-- | tap.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -848,20 +848,25 @@ static int tap_sock_init_tun_ns(void *target_pid) if (ns_enter(*(int *)target_pid)) goto fail; - if ((fd = open("/dev/net/tun", O_RDWR)) < 0) + if ((fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0) goto fail; - fcntl(fd, F_SETFL, O_NONBLOCK); - tun_ns_fd = fd; - if (ioctl(socket(AF_INET, SOCK_DGRAM, 0), SIOCSIFFLAGS, - &((struct ifreq) { .ifr_name = "lo", - .ifr_flags = IFF_UP }))) { + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("socket for ioctl"); + goto fail; + } + + if (ioctl(fd, SIOCSIFFLAGS, &((struct ifreq){ .ifr_name = "lo", + .ifr_flags = IFF_UP }))) { perror("SIOCSIFFLAGS ioctl for \"lo\""); + close(fd); goto fail; } + close(fd); + return 0; fail: |