Skip to content

Commit 9bf2df1

Browse files
committed
libtailscale: EBADF on bad tailscale_listener_close fd
Signed-off-by: David Crawshaw <[email protected]>
1 parent ae40e7a commit 9bf2df1

File tree

3 files changed

+11
-1
lines changed

3 files changed

+11
-1
lines changed

tailscale.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ func TsnetListenerClose(ld C.int) C.int {
201201
defer listeners.mu.Unlock()
202202

203203
l := listeners.m[ld]
204+
if l == nil {
205+
return C.EBADF
206+
}
204207
err := l.ln.Close()
205208
delete(listeners.m, ld)
206209

tailscale.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ extern int tailscale_listen(tailscale sd, const char* network, const char* addr,
103103

104104
// tailscale_listener_close closes the listener.
105105
//
106-
// Returns zero on success or -1 on error, call tailscale_errmsg for details.
106+
// Returns:
107+
// 0 - success
108+
// EBADF - listener is not a valid tailscale_listener
109+
// -1 - call tailscale_errmsg for details
107110
extern int tailscale_listener_close(tailscale_listener listener);
108111

109112
// tailscale_accept accepts a connection on a tailscale_listener.

tsnetctest/tsnetctest.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ int test_conn() {
112112
if ((ret = tailscale_listener_close(ln)) != 0) {
113113
return set_err(s1, 'a');
114114
}
115+
if ((ret = tailscale_listener_close(ln)) != EBADF) {
116+
snprintf(err, errlen, "double tailscale_listener_close = %d (%s), want EBADF", errno, strerror(errno));
117+
return 1;
118+
}
115119
116120
if ((ret = tailscale_loopback(s1, addr, addrlen, proxy_cred, local_api_cred)) != 0) {
117121
return set_err(s1, 'b');

0 commit comments

Comments
 (0)