summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-04-03 11:12:04 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-04-03 17:51:26 +0100
commitdfc910bdc24633897c17caf2293409b5cd4a849b (patch)
tree16c93be00e74beadfc729e6429dbe43f8fa6281a
parentd0082265d5358f672ff00ff2d5c6a4d38564576e (diff)
downloadpoky-dfc910bdc24633897c17caf2293409b5cd4a849b.tar.gz
bitbake: pyinotify: Handle potential latent bug
The kernel inotify code can set more than one of the bits in the mask, fsnotify_change() in linux/fsnotify.h is quite clear that IN_ATTRIB, IN_MODIFY and IN_ACCESS can arrive together. We don't care about two of these from a bitbake perspective but it probably explains why in real world builds, we've seen: pyinotify.ProcessEventError: Unknown mask 0x00000006 This module code assumes only one mask bit can be present. Since we don't care about two of these events, just mask them out for now. The "upstream" code is unmainained since 2015. (Bitbake rev: 7fb93c2ce6dacd9b53fc3a227133a3493e6a6a1d) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/pyinotify.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/bitbake/lib/pyinotify.py b/bitbake/lib/pyinotify.py
index 8c94b3e334..5c9b6d0fe2 100644
--- a/bitbake/lib/pyinotify.py
+++ b/bitbake/lib/pyinotify.py
@@ -603,6 +603,17 @@ class _ProcessEvent:
603 unknown event. 603 unknown event.
604 """ 604 """
605 stripped_mask = event.mask - (event.mask & IN_ISDIR) 605 stripped_mask = event.mask - (event.mask & IN_ISDIR)
606 # Bitbake hack - we see event masks of 0x6, IN_MODIFY & IN_ATTRIB
607 # The kernel inotify code can set more than one of the bits in the mask,
608 # fsnotify_change() in linux/fsnotify.h is quite clear that IN_ATTRIB,
609 # IN_MODIFY and IN_ACCESS can arrive together.
610 # This breaks the code below which assume only one mask bit is ever
611 # set in an event. We don't care about attrib or access in bitbake so drop those
612 if (stripped_mask & IN_MODIFY) and (stripped_mask & IN_ATTRIB):
613 stripped_mask = stripped_mask - (stripped_mask & IN_ATTRIB)
614 if (stripped_mask & IN_MODIFY) and (stripped_mask & IN_ACCESS):
615 stripped_mask = stripped_mask - (stripped_mask & IN_ACCESS)
616
606 maskname = EventsCodes.ALL_VALUES.get(stripped_mask) 617 maskname = EventsCodes.ALL_VALUES.get(stripped_mask)
607 if maskname is None: 618 if maskname is None:
608 raise ProcessEventError("Unknown mask 0x%08x" % stripped_mask) 619 raise ProcessEventError("Unknown mask 0x%08x" % stripped_mask)