libtailscale: EBADF on bad tailscale_listener_close fd

Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
This commit is contained in:
David Crawshaw
2023-03-11 16:26:56 -08:00
committed by David Crawshaw
parent ae40e7a7f7
commit 9bf2df1ab1
3 changed files with 11 additions and 1 deletions

View File

@@ -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)

View File

@@ -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.

View File

@@ -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');