Skip to content

Commit bb3464e

Browse files
authored
bug: fix Unix address parsing absolute path (#731)
1 parent 1e690fc commit bb3464e

File tree

6 files changed

+128
-148
lines changed

6 files changed

+128
-148
lines changed

client_test.go

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -140,18 +140,18 @@ func TestClient(t *testing.T) {
140140
})
141141
t.Run("unix", func(t *testing.T) {
142142
t.Run("1-loop", func(t *testing.T) {
143-
runClient(t, "unix", "gnet1.sock", &testConf{false, 0, false, false, false, false, 10, RoundRobin})
143+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, false, false, false, false, 10, RoundRobin})
144144
})
145145
t.Run("N-loop", func(t *testing.T) {
146-
runClient(t, "unix", "gnet2.sock", &testConf{false, 0, false, true, false, false, 10, SourceAddrHash})
146+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, false, true, false, false, 10, SourceAddrHash})
147147
})
148148
})
149149
t.Run("unix-async", func(t *testing.T) {
150150
t.Run("1-loop", func(t *testing.T) {
151-
runClient(t, "unix", "gnet1.sock", &testConf{false, 0, false, false, true, false, 10, RoundRobin})
151+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, false, false, true, false, 10, RoundRobin})
152152
})
153153
t.Run("N-loop", func(t *testing.T) {
154-
runClient(t, "unix", "gnet2.sock", &testConf{false, 0, false, true, true, false, 10, SourceAddrHash})
154+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, false, true, true, false, 10, SourceAddrHash})
155155
})
156156
})
157157
})
@@ -191,18 +191,18 @@ func TestClient(t *testing.T) {
191191
})
192192
t.Run("unix", func(t *testing.T) {
193193
t.Run("1-loop", func(t *testing.T) {
194-
runClient(t, "unix", "gnet1.sock", &testConf{true, 0, false, false, false, false, 10, RoundRobin})
194+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, false, false, false, false, 10, RoundRobin})
195195
})
196196
t.Run("N-loop", func(t *testing.T) {
197-
runClient(t, "unix", "gnet2.sock", &testConf{true, 0, false, true, false, false, 10, SourceAddrHash})
197+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, false, true, false, false, 10, SourceAddrHash})
198198
})
199199
})
200200
t.Run("unix-async", func(t *testing.T) {
201201
t.Run("1-loop", func(t *testing.T) {
202-
runClient(t, "unix", "gnet1.sock", &testConf{true, 0, false, false, true, false, 10, RoundRobin})
202+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, false, false, true, false, 10, RoundRobin})
203203
})
204204
t.Run("N-loop", func(t *testing.T) {
205-
runClient(t, "unix", "gnet2.sock", &testConf{true, 0, false, true, true, false, 10, SourceAddrHash})
205+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, false, true, true, false, 10, SourceAddrHash})
206206
})
207207
})
208208
})
@@ -242,18 +242,18 @@ func TestClient(t *testing.T) {
242242
})
243243
t.Run("unix", func(t *testing.T) {
244244
t.Run("1-loop", func(t *testing.T) {
245-
runClient(t, "unix", "gnet1.sock", &testConf{true, 1 << 18, false, false, false, false, 10, RoundRobin})
245+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 1 << 18, false, false, false, false, 10, RoundRobin})
246246
})
247247
t.Run("N-loop", func(t *testing.T) {
248-
runClient(t, "unix", "gnet2.sock", &testConf{true, 1 << 19, false, true, false, false, 10, SourceAddrHash})
248+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 1 << 19, false, true, false, false, 10, SourceAddrHash})
249249
})
250250
})
251251
t.Run("unix-async", func(t *testing.T) {
252252
t.Run("1-loop", func(t *testing.T) {
253-
runClient(t, "unix", "gnet1.sock", &testConf{true, 1 << 18, false, false, true, false, 10, RoundRobin})
253+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 1 << 18, false, false, true, false, 10, RoundRobin})
254254
})
255255
t.Run("N-loop", func(t *testing.T) {
256-
runClient(t, "unix", "gnet2.sock", &testConf{true, 1 << 19, false, true, true, false, 10, SourceAddrHash})
256+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 1 << 19, false, true, true, false, 10, SourceAddrHash})
257257
})
258258
})
259259
})
@@ -293,18 +293,18 @@ func TestClient(t *testing.T) {
293293
})
294294
t.Run("unix", func(t *testing.T) {
295295
t.Run("1-loop", func(t *testing.T) {
296-
runClient(t, "unix", "gnet1.sock", &testConf{false, 0, true, false, false, false, 10, RoundRobin})
296+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, true, false, false, false, 10, RoundRobin})
297297
})
298298
t.Run("N-loop", func(t *testing.T) {
299-
runClient(t, "unix", "gnet2.sock", &testConf{false, 0, true, true, false, false, 10, LeastConnections})
299+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, true, true, false, false, 10, LeastConnections})
300300
})
301301
})
302302
t.Run("unix-async", func(t *testing.T) {
303303
t.Run("1-loop", func(t *testing.T) {
304-
runClient(t, "unix", "gnet1.sock", &testConf{false, 0, true, false, true, false, 10, RoundRobin})
304+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, true, false, true, false, 10, RoundRobin})
305305
})
306306
t.Run("N-loop", func(t *testing.T) {
307-
runClient(t, "unix", "gnet2.sock", &testConf{false, 0, true, true, true, false, 10, LeastConnections})
307+
runClient(t, "unix", testUnixAddr(t), &testConf{false, 0, true, true, true, false, 10, LeastConnections})
308308
})
309309
})
310310
})
@@ -344,18 +344,18 @@ func TestClient(t *testing.T) {
344344
})
345345
t.Run("unix", func(t *testing.T) {
346346
t.Run("1-loop", func(t *testing.T) {
347-
runClient(t, "unix", "gnet1.sock", &testConf{true, 0, true, false, false, false, 10, RoundRobin})
347+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, true, false, false, false, 10, RoundRobin})
348348
})
349349
t.Run("N-loop", func(t *testing.T) {
350-
runClient(t, "unix", "gnet2.sock", &testConf{true, 0, true, true, false, false, 10, LeastConnections})
350+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, true, true, false, false, 10, LeastConnections})
351351
})
352352
})
353353
t.Run("unix-async", func(t *testing.T) {
354354
t.Run("1-loop", func(t *testing.T) {
355-
runClient(t, "unix", "gnet1.sock", &testConf{true, 0, true, false, true, false, 10, RoundRobin})
355+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, true, false, true, false, 10, RoundRobin})
356356
})
357357
t.Run("N-loop", func(t *testing.T) {
358-
runClient(t, "unix", "gnet2.sock", &testConf{true, 0, true, true, true, false, 10, LeastConnections})
358+
runClient(t, "unix", testUnixAddr(t), &testConf{true, 0, true, true, true, false, 10, LeastConnections})
359359
})
360360
})
361361
})
@@ -543,7 +543,7 @@ func startGnetClient(t *testing.T, cli *Client, network, addr string, multicore,
543543
}
544544
if netDial {
545545
var netConn net.Conn
546-
netConn, err = stdDial(network, addr)
546+
netConn, err = net.Dial(network, addr)
547547
assert.NoError(t, err)
548548
c, err = cli.EnrollContext(netConn, handler)
549549
} else {

client_windows.go

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ package gnet
1717
import (
1818
"context"
1919
"net"
20-
"os"
21-
"path/filepath"
22-
"sync"
2320

2421
"golang.org/x/sync/errgroup"
2522

@@ -120,29 +117,6 @@ func (cli *Client) Stop() error {
120117
return err
121118
}
122119

123-
var (
124-
mu sync.RWMutex
125-
unixAddrDirs = make(map[string]string)
126-
)
127-
128-
// unixAddr uses os.MkdirTemp to get a name that is unique.
129-
func unixAddr(addr string) string {
130-
// Pass an empty pattern to get a directory name that is as short as possible.
131-
// If we end up with a name longer than the sun_path field in the sockaddr_un
132-
// struct, we won't be able to make the syscall to open the socket.
133-
d, err := os.MkdirTemp("", "")
134-
if err != nil {
135-
panic(err)
136-
}
137-
138-
tmpAddr := filepath.Join(d, addr)
139-
mu.Lock()
140-
unixAddrDirs[tmpAddr] = d
141-
mu.Unlock()
142-
143-
return tmpAddr
144-
}
145-
146120
func (cli *Client) Dial(network, addr string) (Conn, error) {
147121
return cli.DialContext(network, addr, nil)
148122
}
@@ -152,18 +126,9 @@ func (cli *Client) DialContext(network, addr string, ctx any) (Conn, error) {
152126
c net.Conn
153127
err error
154128
)
155-
if network == "unix" {
156-
laddr, _ := net.ResolveUnixAddr(network, unixAddr(addr))
157-
raddr, _ := net.ResolveUnixAddr(network, addr)
158-
c, err = net.DialUnix(network, laddr, raddr)
159-
if err != nil {
160-
return nil, err
161-
}
162-
} else {
163-
c, err = net.Dial(network, addr)
164-
if err != nil {
165-
return nil, err
166-
}
129+
c, err = net.Dial(network, addr)
130+
if err != nil {
131+
return nil, err
167132
}
168133
return cli.EnrollContext(c, ctx)
169134
}
@@ -219,12 +184,6 @@ func (cli *Client) EnrollContext(nc net.Conn, ctx any) (gc Conn, err error) {
219184
n, err := nc.Read(buffer[:])
220185
if err != nil {
221186
el.ch <- &netErr{c, err}
222-
mu.RLock()
223-
tmpDir := unixAddrDirs[nc.LocalAddr().String()]
224-
mu.RUnlock()
225-
if err := os.RemoveAll(tmpDir); err != nil {
226-
logging.Errorf("failed to remove temporary directory for unix local address: %v", err)
227-
}
228187
return
229188
}
230189
el.ch <- packTCPConn(c, buffer[:n])

gnet.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"io"
2424
"net"
2525
"net/url"
26+
"path"
2627
"runtime"
2728
"strings"
2829
"sync"
@@ -748,24 +749,41 @@ func Stop(ctx context.Context, protoAddr string) error {
748749

749750
func parseProtoAddr(protoAddr string) (string, string, error) {
750751
// Percent-encode "%" in the address to avoid url.Parse error.
751-
// For example: udp://[ff02::3%lo0]:9991
752+
// This is for cases like this: udp://[ff02::3%lo0]:9991
752753
protoAddr = strings.ReplaceAll(protoAddr, "%", "%25")
753754

755+
if runtime.GOOS == "windows" {
756+
if strings.HasPrefix(protoAddr, "unix://") {
757+
parts := strings.SplitN(protoAddr, "://", 2)
758+
if parts[1] == "" {
759+
return "", "", errorx.ErrInvalidNetworkAddress
760+
}
761+
return parts[0], parts[1], nil
762+
}
763+
}
764+
754765
u, err := url.Parse(protoAddr)
755766
if err != nil {
756767
return "", "", err
757768
}
758769

759-
if u.Scheme == "" || u.Host == "" || u.Path != "" {
760-
return "", "", errorx.ErrInvalidNetworkAddress
761-
}
762770
switch u.Scheme {
763-
case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6", "unix":
771+
case "":
772+
return "", "", errorx.ErrInvalidNetworkAddress
773+
case "tcp", "tcp4", "tcp6", "udp", "udp4", "udp6":
774+
if u.Host == "" || u.Path != "" {
775+
return "", "", errorx.ErrInvalidNetworkAddress
776+
}
777+
return u.Scheme, u.Host, nil
778+
case "unix":
779+
hostPath := path.Join(u.Host, u.Path)
780+
if hostPath == "" {
781+
return "", "", errorx.ErrInvalidNetworkAddress
782+
}
783+
return u.Scheme, hostPath, nil
764784
default:
765785
return "", "", errorx.ErrUnsupportedProtocol
766786
}
767-
768-
return u.Scheme, u.Host, nil
769787
}
770788

771789
func determineEventLoops(opts *Options) int {

0 commit comments

Comments
 (0)