From 1679ef31ef15344eba218a5251fa1fb1438b4cb7 Mon Sep 17 00:00:00 2001
From: Fabricio Voznika <fvoznika@google.com>
Date: Fri, 21 Dec 2018 11:52:39 -0800
Subject: inotify notifies watchers when control events bit are set

The code that matches the event being published with events watchers
was wronly matching all watchers in case any of the control event bits
were set.

Issue #121

PiperOrigin-RevId: 226521230
Change-Id: Ie2c42bc4366faaf59fbf80a74e9297499bd93f9e
---
 pkg/sentry/fs/inotify_watch.go | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

(limited to 'pkg/sentry/fs')

diff --git a/pkg/sentry/fs/inotify_watch.go b/pkg/sentry/fs/inotify_watch.go
index b83544c9f..d33e7e498 100644
--- a/pkg/sentry/fs/inotify_watch.go
+++ b/pkg/sentry/fs/inotify_watch.go
@@ -76,15 +76,17 @@ func isRenameEvent(eventMask uint32) bool {
 
 // Notify queues a new event on this watch.
 func (w *Watch) Notify(name string, events uint32, cookie uint32) {
-	unmaskableBits := ^uint32(0) &^ linux.IN_ALL_EVENTS
-	effectiveMask := unmaskableBits | atomic.LoadUint32(&w.mask)
-	matchedEvents := effectiveMask & events
-
-	if matchedEvents == 0 {
+	mask := atomic.LoadUint32(&w.mask)
+	if mask&events == 0 {
 		// We weren't watching for this event.
 		return
 	}
 
+	// Event mask should include bits matched from the watch plus all control
+	// event bits.
+	unmaskableBits := ^uint32(0) &^ linux.IN_ALL_EVENTS
+	effectiveMask := unmaskableBits | mask
+	matchedEvents := effectiveMask & events
 	w.owner.queueEvent(newEvent(w.wd, name, matchedEvents, cookie))
 }
 
-- 
cgit v1.2.3