Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

linux/udev: fix udevadm info parser to not be fatal #132

Merged
merged 1 commit into from
Feb 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 37 additions & 4 deletions linux/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,50 @@
}

toks = bytes.SplitN(line, []byte(": "), 2)
payload = string(toks[1])

if len(toks) != 2 {
log.Printf("parseUdevInfo: ignoring unparsable line %q\n", line)
continue

Check warning on line 54 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L53-L54

Added lines #L53 - L54 were not covered by tests
}

payload = string(toks[1])
switch toks[0][0] {
case 'P':
// Device path in /sys/
info.SysPath = payload
case 'M':
// Device name in /sys/ (i.e. the last component of "P:")
continue
case 'R':

Check warning on line 65 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L65

Added line #L65 was not covered by tests
// Device number in /sys/ (i.e. the numeric suffix of the last component of "P:")
continue
case 'U':

Check warning on line 68 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L67-L68

Added lines #L67 - L68 were not covered by tests
// Kernel subsystem
continue
case 'T':

Check warning on line 71 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L70-L71

Added lines #L70 - L71 were not covered by tests
// Kernel device type with subsystem
continue
case 'D':

Check warning on line 74 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L73-L74

Added lines #L73 - L74 were not covered by tests
// Kernel device node major/minor
continue
case 'I':

Check warning on line 77 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L76-L77

Added lines #L76 - L77 were not covered by tests
// Network interface index
continue

Check warning on line 79 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L79

Added line #L79 was not covered by tests
case 'N':
// Kernel device node name
info.Name = payload
case 'L':
// Device node symlink priority
continue
case 'S':
// Device node symlink
info.Symlinks = append(info.Symlinks, strings.Split(payload, " ")...)
case 'Q':

Check warning on line 89 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L89

Added line #L89 was not covered by tests
// Block device sequence number (DISKSEQ)
continue
case 'V':

Check warning on line 92 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L91-L92

Added lines #L91 - L92 were not covered by tests
// Attached driver
continue

Check warning on line 94 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L94

Added line #L94 was not covered by tests
case 'E':
kv := strings.SplitN(payload, "=", 2)
// use of Unquote is to decode \x20, \x2f and friends.
Expand All @@ -68,10 +103,8 @@
}

info.Properties[kv[0]] = strings.TrimSpace(s)
case 'L':
// a 'devlink priority'. skip for now.
default:
return fmt.Errorf("error parsing line: (%s)", line)
log.Printf("parseUdevInfo: ignoring unknown udevadm info prefix %q in %q\n", toks[0][0], line)

Check warning on line 107 in linux/util.go

View check run for this annotation

Codecov / codecov/patch

linux/util.go#L107

Added line #L107 was not covered by tests
}
}

Expand Down
2 changes: 2 additions & 0 deletions linux/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
func TestParseUdevInfo(t *testing.T) {
data := []byte(`P: /devices/virtual/block/dm-0
N: dm-0
M: dm-0
S: disk/by-id/dm-name-nvme0n1p6_crypt
S: disk/by-id/dm-uuid-CRYPT-LUKS1-b174c64e7a714359a8b56b79fb66e92b-nvme0n1p6_crypt
S: disk/by-uuid/25df9069-80c7-46f4-a47c-305613c2cb6b
Expand Down Expand Up @@ -49,6 +50,7 @@ E: DEVNAME=/dev/dm-0
func TestParseUdevInfo2(t *testing.T) {
data := []byte(`P: /devices/pci0000:00/..../block/sda
N: sda
M: sda
S: disk/by-id/scsi-35000c500a0d8963f
S: disk/by-id/wwn-0x5000c500a0d8963f
S: disk/by-path/pci-0000:05:00.0-scsi-0:0:8:0
Expand Down
Loading