Skip to content

Commit 14119d8

Browse files
committed
libtailscale: match close semantics, remove race
It is theoretically possible for separate calls to tailscale_close to race and cause a mess, so move the load+delete under a single mutex lock. While here, give it the closer error semantics to tailscale_listener_close. Signed-off-by: David Crawshaw <[email protected]>
1 parent 9bf2df1 commit 14119d8

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

tailscale.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,21 @@ func TsnetUp(sd C.int) C.int {
121121

122122
//export TsnetClose
123123
func TsnetClose(sd C.int) C.int {
124-
s, err := getServer(sd)
125-
if err != nil {
126-
return s.recErr(err)
127-
}
128-
129124
servers.mu.Lock()
130-
delete(servers.m, sd)
125+
s := servers.m[sd]
126+
if s != nil {
127+
delete(servers.m, sd)
128+
}
131129
servers.mu.Unlock()
132130

131+
if s == nil {
132+
return C.EBADF
133+
}
134+
133135
// TODO: cancel Up
134136
// TODO: close related listeners / conns.
135137
if err := s.s.Close(); err != nil {
138+
s.s.Logf("tailscale_close: failed with %v", err)
136139
return -1
137140
}
138141

tailscale.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ extern int tailscale_up(tailscale sd);
4141

4242
// tailscale_close shuts down the server.
4343
//
44-
// Returns zero on success or -1 on error. No error details are available.
44+
// Returns:
45+
// 0 - success
46+
// EBADF - sd is not a valid tailscale
47+
// -1 - other error, details printed to the tsnet logger
4548
extern int tailscale_close(tailscale sd);
4649

4750
// The following set tailscale configuration options.

0 commit comments

Comments
 (0)