Skip to content

Commit d81f78a

Browse files
authored
Merge pull request #1699 from balajiv113/fix-path-size
Fix usernet socket name too long
2 parents 7e99eb6 + 3c30d3c commit d81f78a

File tree

3 files changed

+70
-8
lines changed

3 files changed

+70
-8
lines changed

pkg/networks/usernet/config.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"path/filepath"
66

7+
"github.com/lima-vm/lima/pkg/osutil"
78
"github.com/lima-vm/lima/pkg/store/dirnames"
89
)
910

@@ -12,7 +13,7 @@ type SockType = string
1213
const (
1314
FDSock = "fd"
1415
QEMUSock = "qemu"
15-
EndpointSock = "endpoint"
16+
EndpointSock = "ep"
1617
)
1718

1819
// Sock returns a usernet socket based on name and sockType.
@@ -21,12 +22,20 @@ func Sock(name string, sockType SockType) (string, error) {
2122
if err != nil {
2223
return "", err
2324
}
24-
return SockWithDirectory(filepath.Join(dir, name), name, sockType), nil
25+
return SockWithDirectory(filepath.Join(dir, name), name, sockType)
2526
}
2627

2728
// SockWithDirectory return a usernet socket based on dir, name and sockType
28-
func SockWithDirectory(dir string, name string, sockType SockType) string {
29-
return filepath.Join(dir, fmt.Sprintf("usernet_%s_%s.sock", name, sockType))
29+
func SockWithDirectory(dir string, name string, sockType SockType) (string, error) {
30+
if name == "" {
31+
name = "default"
32+
}
33+
sockPath := filepath.Join(dir, fmt.Sprintf("%s_%s.sock", name, sockType))
34+
if len(sockPath) >= osutil.UnixPathMax {
35+
return "", fmt.Errorf("usernet socket path %q too long: must be less than UNIX_PATH_MAX=%d characters, but is %d",
36+
sockPath, osutil.UnixPathMax, len(sockPath))
37+
}
38+
return sockPath, nil
3039
}
3140

3241
// PIDFile returns a path for usernet PID file

pkg/networks/usernet/config_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package usernet
2+
3+
import (
4+
"path/filepath"
5+
"strings"
6+
"testing"
7+
8+
"github.com/lima-vm/lima/pkg/store/dirnames"
9+
"github.com/lima-vm/lima/pkg/store/filenames"
10+
"gotest.tools/v3/assert"
11+
)
12+
13+
func TestConfig(t *testing.T) {
14+
t.Run("max network path in instance directory", func(t *testing.T) {
15+
limaHome, err := dirnames.LimaDir()
16+
assert.NilError(t, err)
17+
longName := strings.Repeat("a", len(filenames.LongestSock))
18+
longestInstDir := filepath.Join(limaHome, longName)
19+
_, err = SockWithDirectory(longestInstDir, longName, QEMUSock)
20+
assert.NilError(t, err)
21+
})
22+
23+
t.Run("max network path in _networks directory", func(t *testing.T) {
24+
instName := strings.Repeat("a", len(filenames.LongestSock))
25+
_, err := Sock(instName, EndpointSock)
26+
assert.NilError(t, err)
27+
})
28+
29+
t.Run("throw error for invalid socket path", func(t *testing.T) {
30+
limaHome, err := dirnames.LimaDir()
31+
assert.NilError(t, err)
32+
longName := strings.Repeat("a", len(filenames.LongestSock))
33+
longestInstDir := filepath.Join(limaHome, longName)
34+
invalidName := strings.Repeat(longName, 4)
35+
_, err = SockWithDirectory(longestInstDir, invalidName, QEMUSock)
36+
assert.ErrorContains(t, err, "must be less than UNIX_PATH_MAX=")
37+
})
38+
39+
t.Run("default as name when empty", func(t *testing.T) {
40+
path, err := SockWithDirectory("test", "", QEMUSock)
41+
assert.NilError(t, err)
42+
assert.Equal(t, path, filepath.Join("test", "default_qemu.sock"))
43+
})
44+
}

pkg/vz/vm_darwin.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,17 @@ func startUsernet(ctx context.Context, driver *driver.BaseDriver) (*usernet.Clie
121121
firstUsernetIndex := limayaml.FirstUsernetIndex(driver.Yaml)
122122
if firstUsernetIndex == -1 {
123123
//Start a in-process gvisor-tap-vsock
124-
endpointSock := usernet.SockWithDirectory(driver.Instance.Dir, "", usernet.EndpointSock)
125-
vzSock := usernet.SockWithDirectory(driver.Instance.Dir, "", usernet.FDSock)
124+
endpointSock, err := usernet.SockWithDirectory(driver.Instance.Dir, "", usernet.EndpointSock)
125+
if err != nil {
126+
return nil, err
127+
}
128+
vzSock, err := usernet.SockWithDirectory(driver.Instance.Dir, "", usernet.FDSock)
129+
if err != nil {
130+
return nil, err
131+
}
126132
os.RemoveAll(endpointSock)
127133
os.RemoveAll(vzSock)
128-
err := usernet.StartGVisorNetstack(ctx, &usernet.GVisorNetstackOpts{
134+
err = usernet.StartGVisorNetstack(ctx, &usernet.GVisorNetstackOpts{
129135
MTU: 1500,
130136
Endpoint: endpointSock,
131137
FdSocket: vzSock,
@@ -278,7 +284,10 @@ func attachNetwork(driver *driver.BaseDriver, vmConfig *vz.VirtualMachineConfigu
278284
firstUsernetIndex := limayaml.FirstUsernetIndex(driver.Yaml)
279285
if firstUsernetIndex == -1 {
280286
//slirp network using gvisor netstack
281-
vzSock := usernet.SockWithDirectory(driver.Instance.Dir, "", usernet.FDSock)
287+
vzSock, err := usernet.SockWithDirectory(driver.Instance.Dir, "", usernet.FDSock)
288+
if err != nil {
289+
return err
290+
}
282291
networkConn, err := PassFDToUnix(vzSock)
283292
if err != nil {
284293
return err

0 commit comments

Comments
 (0)