Skip to content

Commit 0530a56

Browse files
committed
Fix: Improve error message for empty device modes in API requests
- Add specific check for empty device modes in ParseDevice function - Change error message from 'invalid device mode: ' to 'empty device mode in device specification: <device>' - Include full device specification in error message for better context - Add test cases for empty device mode scenarios - Resolves issue where '/dev/fuse::' provided unhelpful error message Fixes #26629 Signed-off-by: Devashish08 <[email protected]>
1 parent eabb64d commit 0530a56

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

pkg/specgen/generate/config_common.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@ func ParseDevice(device string) (string, string, string, error) {
1515
arr := strings.Split(device, ":")
1616
switch len(arr) {
1717
case 3:
18+
if arr[2] == "" {
19+
return "", "", "", fmt.Errorf("empty device mode in device specification: %s", device)
20+
}
1821
if !IsValidDeviceMode(arr[2]) {
19-
return "", "", "", fmt.Errorf("invalid device mode: %s", arr[2])
22+
return "", "", "", fmt.Errorf("invalid device mode %q in device %q", arr[2], device)
2023
}
2124
permissions = arr[2]
2225
fallthrough
@@ -25,7 +28,7 @@ func ParseDevice(device string) (string, string, string, error) {
2528
permissions = arr[1]
2629
} else {
2730
if len(arr[1]) > 0 && arr[1][0] != '/' {
28-
return "", "", "", fmt.Errorf("invalid device mode: %s", arr[1])
31+
return "", "", "", fmt.Errorf("invalid device mode %q in device %q", arr[1], device)
2932
}
3033
dst = arr[1]
3134
}

pkg/specgen/generate/config_common_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func TestParseDevice(t *testing.T) {
2020
{"/dev/foo:/dev/bar:rw", "/dev/foo", "/dev/bar", "rw"},
2121
{"/dev/foo:rw", "/dev/foo", "/dev/foo", "rw"},
2222
{"/dev/foo::rw", "/dev/foo", "/dev/foo", "rw"},
23+
{"/dev/foo:", "/dev/foo", "/dev/foo", "rwm"},
2324
}
2425
for _, test := range tests {
2526
src, dst, perm, err := ParseDevice(test.device)
@@ -29,3 +30,26 @@ func TestParseDevice(t *testing.T) {
2930
assert.Equal(t, perm, test.perm)
3031
}
3132
}
33+
34+
func TestParseDeviceErrors(t *testing.T) {
35+
errorTests := []struct {
36+
device string
37+
expectedError string
38+
}{
39+
{"/dev/fuse::", "empty device mode in device specification: /dev/fuse::"},
40+
{"/dev/fuse:invalid", `invalid device mode "invalid" in device "/dev/fuse:invalid"`},
41+
{"/dev/fuse:/path:xyz", `invalid device mode "xyz" in device "/dev/fuse:/path:xyz"`},
42+
{"/dev/fuse:/path:rw:extra", `invalid device specification: /dev/fuse:/path:rw:extra`},
43+
{"/dev/fuse:/path:rw:extra:more", `invalid device specification: /dev/fuse:/path:rw:extra:more`},
44+
{"/dev/fuse:notapath", `invalid device mode "notapath" in device "/dev/fuse:notapath"`},
45+
{"/dev/fuse:x", `invalid device mode "x" in device "/dev/fuse:x"`},
46+
{"/dev/fuse:rwx", `invalid device mode "rwx" in device "/dev/fuse:rwx"`},
47+
{"/dev/fuse:rrw", `invalid device mode "rrw" in device "/dev/fuse:rrw"`},
48+
}
49+
50+
for _, test := range errorTests {
51+
_, _, _, err := ParseDevice(test.device)
52+
assert.Error(t, err)
53+
assert.Contains(t, err.Error(), test.expectedError)
54+
}
55+
}

test/e2e/run_device_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ var _ = Describe("Podman run device", func() {
8282
It("podman run device rename and bad permission test", func() {
8383
session := podmanTest.Podman([]string{"run", "-q", "--security-opt", "label=disable", "--device", "/dev/kmsg:/dev/kmsg1:rd", ALPINE, "true"})
8484
session.WaitWithDefaultTimeout()
85-
Expect(session).Should(ExitWithError(125, "invalid device mode: rd"))
85+
Expect(session).Should(ExitWithError(125, "invalid device mode \"rd\" in device \"/dev/kmsg:/dev/kmsg1:rd\""))
86+
})
87+
88+
It("podman run device with empty mode test", func() {
89+
session := podmanTest.Podman([]string{"run", "-q", "--device", "/dev/fuse::", ALPINE, "true"})
90+
session.WaitWithDefaultTimeout()
91+
Expect(session).Should(ExitWithError(125, "empty device mode in device specification: /dev/fuse::"))
8692
})
8793

8894
It("podman run device host device and container device parameter are directories", func() {

0 commit comments

Comments
 (0)