diff options
| -rw-r--r-- | internal/file/file.go | 16 | ||||
| -rw-r--r-- | internal/file/file_test.go | 43 |
2 files changed, 57 insertions, 2 deletions
diff --git a/internal/file/file.go b/internal/file/file.go index b95d40b..8510b61 100644 --- a/internal/file/file.go +++ b/internal/file/file.go @@ -56,7 +56,12 @@ func NewFdWithPid(fd int32, pid uint32) *FdFile { return f } - f.flags, _ = readFlagsFromFdInfo(fd, pid) + flags, err := readFlagsFromFdInfo(fd, pid) + if err != nil { + f.flags = unknownFlag + } else { + f.flags = flags + } f.flagsFromProcFS = true return f @@ -73,6 +78,10 @@ func readFlagsFromFdInfo(fd int32, pid uint32) (Flags, error) { if err != nil { return unknownFlag, err } + return parseFlagsFromFdInfo(data) +} + +func parseFlagsFromFdInfo(data []byte) (Flags, error) { scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { line := scanner.Text() @@ -82,7 +91,10 @@ func readFlagsFromFdInfo(fd int32, pid uint32) (Flags, error) { return Flags(flags), err } } - return unknownFlag, scanner.Err() + if err := scanner.Err(); err != nil { + return unknownFlag, err + } + return unknownFlag, fmt.Errorf("flags field not found in fdinfo") } func (f *FdFile) Name() string { diff --git a/internal/file/file_test.go b/internal/file/file_test.go index f9025fe..744f37e 100644 --- a/internal/file/file_test.go +++ b/internal/file/file_test.go @@ -1,6 +1,7 @@ package file import ( + "bytes" "strings" "syscall" "testing" @@ -107,3 +108,45 @@ func TestFdFileDup(t *testing.T) { t.Errorf("expected duped String() to NOT contain old fd 1, got '%s'", duped.String()) } } + +func TestParseFlagsFromFdInfo(t *testing.T) { + t.Run("valid flags", func(t *testing.T) { + flags, err := parseFlagsFromFdInfo([]byte("pos:\t0\nflags:\t0100002\nmnt_id:\t24\n")) + if err != nil { + t.Fatalf("parseFlagsFromFdInfo valid err = %v", err) + } + if flags != Flags(0o100002) { + t.Fatalf("parseFlagsFromFdInfo valid flags = %v, want %v", flags, Flags(0o100002)) + } + }) + + t.Run("invalid octal", func(t *testing.T) { + flags, err := parseFlagsFromFdInfo([]byte("flags:\tnot-octal\n")) + if err == nil { + t.Fatalf("parseFlagsFromFdInfo invalid octal expected error") + } + if flags != 0 { + t.Fatalf("parseFlagsFromFdInfo invalid octal flags = %v, want 0", flags) + } + }) + + t.Run("missing flags", func(t *testing.T) { + flags, err := parseFlagsFromFdInfo([]byte("pos:\t0\nmnt_id:\t24\n")) + if err == nil { + t.Fatalf("parseFlagsFromFdInfo missing flags expected error") + } + if flags != unknownFlag { + t.Fatalf("parseFlagsFromFdInfo missing flags = %v, want %v", flags, unknownFlag) + } + }) + + t.Run("scanner error", func(t *testing.T) { + flags, err := parseFlagsFromFdInfo(bytes.Repeat([]byte("x"), 128*1024)) + if err == nil { + t.Fatalf("parseFlagsFromFdInfo scanner error expected error") + } + if flags != unknownFlag { + t.Fatalf("parseFlagsFromFdInfo scanner error flags = %v, want %v", flags, unknownFlag) + } + }) +} |
