From ef24d7980c50f706286d99ab6d80a98af89970e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Tue, 6 Jul 2021 01:14:44 +0200 Subject: [PATCH] hswg: improve inotify processing Make sure to read the whole record before checking flags. --- hswg/main.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/hswg/main.go b/hswg/main.go index 9eaca84..6cec971 100644 --- a/hswg/main.go +++ b/hswg/main.go @@ -334,6 +334,15 @@ func dispatchEvents(dirname string, r io.Reader, ch chan<- *watchEvent) error { return err } + base := make([]byte, e.Len) + if e.Len != 0 { + if n, err := r.Read(base); err != nil { + return err + } else if n < int(e.Len) { + return fmt.Errorf("short read") + } + } + switch { case e.Mask&syscall.IN_IGNORED != 0: return fmt.Errorf("watch removed by kernel") @@ -345,13 +354,6 @@ func dispatchEvents(dirname string, r io.Reader, ch chan<- *watchEvent) error { continue } - base := make([]byte, e.Len) - if n, err := r.Read(base); err != nil { - return err - } else if n < int(e.Len) { - return fmt.Errorf("short read") - } - basename, interesting := string(base[:bytes.IndexByte(base, 0)]), false for _, glob := range globs { if matches, _ := filepath.Match(glob, basename); matches {