diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-04-03 11:12:04 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-04-03 17:51:26 +0100 |
commit | dfc910bdc24633897c17caf2293409b5cd4a849b (patch) | |
tree | 16c93be00e74beadfc729e6429dbe43f8fa6281a /bitbake | |
parent | d0082265d5358f672ff00ff2d5c6a4d38564576e (diff) | |
download | poky-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>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/pyinotify.py | 11 |
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) |