diff --git a/tailscale.go b/tailscale.go index c78fb3f..e7b8f20 100644 --- a/tailscale.go +++ b/tailscale.go @@ -201,6 +201,9 @@ func TsnetListenerClose(ld C.int) C.int { defer listeners.mu.Unlock() l := listeners.m[ld] + if l == nil { + return C.EBADF + } err := l.ln.Close() delete(listeners.m, ld) diff --git a/tailscale.h b/tailscale.h index 73618cc..daa6f20 100644 --- a/tailscale.h +++ b/tailscale.h @@ -103,7 +103,10 @@ extern int tailscale_listen(tailscale sd, const char* network, const char* addr, // tailscale_listener_close closes the listener. // -// Returns zero on success or -1 on error, call tailscale_errmsg for details. +// Returns: +// 0 - success +// EBADF - listener is not a valid tailscale_listener +// -1 - call tailscale_errmsg for details extern int tailscale_listener_close(tailscale_listener listener); // tailscale_accept accepts a connection on a tailscale_listener. diff --git a/tsnetctest/tsnetctest.go b/tsnetctest/tsnetctest.go index 371cab6..e386c0f 100644 --- a/tsnetctest/tsnetctest.go +++ b/tsnetctest/tsnetctest.go @@ -112,6 +112,10 @@ int test_conn() { if ((ret = tailscale_listener_close(ln)) != 0) { return set_err(s1, 'a'); } + if ((ret = tailscale_listener_close(ln)) != EBADF) { + snprintf(err, errlen, "double tailscale_listener_close = %d (%s), want EBADF", errno, strerror(errno)); + return 1; + } if ((ret = tailscale_loopback(s1, addr, addrlen, proxy_cred, local_api_cred)) != 0) { return set_err(s1, 'b');