* [PATCH wireguard-go] tun: avoid leaking sock fd in CreateTUN error cases
@ 2021-09-23 10:05 Tobias Klauser
2021-09-23 15:54 ` Jason A. Donenfeld
0 siblings, 1 reply; 3+ messages in thread
From: Tobias Klauser @ 2021-09-23 10:05 UTC (permalink / raw)
To: wireguard
At these points, the socket file descriptor is not yet wrapped in an
*os.File, so it needs to be closed explicitly on error.
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
---
tun/tun_darwin.go | 6 ++++--
tun/tun_linux.go | 11 +++++++----
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/tun/tun_darwin.go b/tun/tun_darwin.go
index a703c8c34eac..35d3085747cc 100644
--- a/tun/tun_darwin.go
+++ b/tun/tun_darwin.go
@@ -108,7 +108,6 @@ func CreateTUN(name string, mtu int) (Device, error) {
}
fd, err := unix.Socket(unix.AF_SYSTEM, unix.SOCK_DGRAM, 2)
-
if err != nil {
return nil, err
}
@@ -117,6 +116,7 @@ func CreateTUN(name string, mtu int) (Device, error) {
copy(ctlInfo.Name[:], []byte(utunControlName))
err = unix.IoctlCtlInfo(fd, ctlInfo)
if err != nil {
+ unix.Close(fd)
return nil, fmt.Errorf("IoctlGetCtlInfo: %w", err)
}
@@ -127,11 +127,13 @@ func CreateTUN(name string, mtu int) (Device, error) {
err = unix.Connect(fd, sc)
if err != nil {
+ unix.Close(fd)
return nil, err
}
- err = syscall.SetNonblock(fd, true)
+ err = unix.SetNonblock(fd, true)
if err != nil {
+ unix.Close(fd)
return nil, err
}
tun, err := CreateTUNFromFile(os.NewFile(uintptr(fd), ""), mtu)
diff --git a/tun/tun_linux.go b/tun/tun_linux.go
index 466a805671c1..1cc84cba0ee5 100644
--- a/tun/tun_linux.go
+++ b/tun/tun_linux.go
@@ -419,6 +419,7 @@ func CreateTUN(name string, mtu int) (Device, error) {
var flags uint16 = unix.IFF_TUN // | unix.IFF_NO_PI (disabled for TUN status hack)
nameBytes := []byte(name)
if len(nameBytes) >= unix.IFNAMSIZ {
+ unix.Close(nfd)
return nil, fmt.Errorf("interface name too long: %w", unix.ENAMETOOLONG)
}
copy(ifr[:], nameBytes)
@@ -431,17 +432,19 @@ func CreateTUN(name string, mtu int) (Device, error) {
uintptr(unsafe.Pointer(&ifr[0])),
)
if errno != 0 {
+ unix.Close(nfd)
return nil, errno
}
- err = unix.SetNonblock(nfd, true)
-
- // Note that the above -- open,ioctl,nonblock -- must happen prior to handing it to netpoll as below this line.
- fd := os.NewFile(uintptr(nfd), cloneDevicePath)
+ err = unix.SetNonblock(nfd, true)
if err != nil {
+ unix.Close(nfd)
return nil, err
}
+ // Note that the above -- open,ioctl,nonblock -- must happen prior to handing it to netpoll as below this line.
+
+ fd := os.NewFile(uintptr(nfd), cloneDevicePath)
return CreateTUNFromFile(fd, mtu)
}
--
2.33.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH wireguard-go] tun: avoid leaking sock fd in CreateTUN error cases
2021-09-23 10:05 [PATCH wireguard-go] tun: avoid leaking sock fd in CreateTUN error cases Tobias Klauser
@ 2021-09-23 15:54 ` Jason A. Donenfeld
2021-09-24 8:45 ` Tobias Klauser
0 siblings, 1 reply; 3+ messages in thread
From: Jason A. Donenfeld @ 2021-09-23 15:54 UTC (permalink / raw)
To: Tobias Klauser; +Cc: WireGuard mailing list
Applied, thanks! I'm curious: is this a bug you ran into somewhere?
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH wireguard-go] tun: avoid leaking sock fd in CreateTUN error cases
2021-09-23 15:54 ` Jason A. Donenfeld
@ 2021-09-24 8:45 ` Tobias Klauser
0 siblings, 0 replies; 3+ messages in thread
From: Tobias Klauser @ 2021-09-24 8:45 UTC (permalink / raw)
To: Jason A. Donenfeld; +Cc: WireGuard mailing list
On 2021-09-23 at 17:54:20 +0200, Jason A. Donenfeld <Jason@zx2c4.com> wrote:
> Applied, thanks! I'm curious: is this a bug you ran into somewhere?
I've not seen this causing problems with wireguard-go specifically, but
have seen issues with leaked fds elsewhere. So by now I'm attentive of
the pattern and send fixes where I notice it :)
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-09-24 8:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-23 10:05 [PATCH wireguard-go] tun: avoid leaking sock fd in CreateTUN error cases Tobias Klauser
2021-09-23 15:54 ` Jason A. Donenfeld
2021-09-24 8:45 ` Tobias Klauser
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).