summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/file/file.go16
-rw-r--r--internal/file/file_test.go43
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)
+ }
+ })
+}