The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=da8ab13249420e85935b89794f333f0755e56385
commit da8ab13249420e85935b89794f333f0755e56385 Author: Mark Johnston <[email protected]> AuthorDate: 2025-12-21 23:49:26 +0000 Commit: Mark Johnston <[email protected]> CommitDate: 2025-12-22 14:47:27 +0000 inotify: Avoid resetting the cookie The IN_MOVED_FROM and _TO events only apply to names in a watched directory, never to a watched directory itself. So, the cookie value there is always zero, and in particular we should not reset the caller-provided cookie value, as it may be used later. Add a regression test. Reported by: arrowd MFC after: 1 week --- sys/kern/vfs_inotify.c | 7 ++----- tests/sys/kern/inotify_test.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/sys/kern/vfs_inotify.c b/sys/kern/vfs_inotify.c index fd1ef39b13f7..716fdc96e5fb 100644 --- a/sys/kern/vfs_inotify.c +++ b/sys/kern/vfs_inotify.c @@ -723,7 +723,6 @@ vn_inotify(struct vnode *vp, struct vnode *dvp, struct componentname *cnp, } break; case IN_MOVED_FROM: - cookie = 0; selfevent = IN_MOVE_SELF; break; case _IN_ATTRIB_LINKCOUNT: @@ -734,10 +733,8 @@ vn_inotify(struct vnode *vp, struct vnode *dvp, struct componentname *cnp, break; } - if ((selfevent & ~_IN_DIR_EVENTS) != 0) { - inotify_log(vp, NULL, 0, selfevent | isdir, - cookie); - } + if ((selfevent & ~_IN_DIR_EVENTS) != 0) + inotify_log(vp, NULL, 0, selfevent | isdir, 0); } /* diff --git a/tests/sys/kern/inotify_test.c b/tests/sys/kern/inotify_test.c index 713db55afc22..0a4df4e5fcaa 100644 --- a/tests/sys/kern/inotify_test.c +++ b/tests/sys/kern/inotify_test.c @@ -761,6 +761,36 @@ ATF_TC_BODY(inotify_event_move, tc) close_inotify(ifd); } +ATF_TC_WITHOUT_HEAD(inotify_event_move_dir); +ATF_TC_BODY(inotify_event_move_dir, tc) +{ + char dir[PATH_MAX], subdir1[PATH_MAX], subdir2[PATH_MAX]; + uint32_t cookie1, cookie2; + int error, ifd, wd1, wd2; + + ifd = inotify(IN_NONBLOCK); + + wd1 = watch_dir(ifd, IN_MOVE, dir); + snprintf(subdir1, sizeof(subdir1), "%s/subdir", dir); + error = mkdir(subdir1, 0755); + ATF_REQUIRE(error == 0); + wd2 = inotify_add_watch(ifd, subdir1, IN_MOVE); + ATF_REQUIRE(wd2 != -1); + + snprintf(subdir2, sizeof(subdir2), "%s/newsubdir", dir); + error = rename(subdir1, subdir2); + ATF_REQUIRE(error == 0); + + cookie1 = consume_event_cookie(ifd, wd1, IN_MOVED_FROM, IN_ISDIR, + "subdir"); + cookie2 = consume_event_cookie(ifd, wd1, IN_MOVED_TO, IN_ISDIR, + "newsubdir"); + ATF_REQUIRE_MSG(cookie1 == cookie2, + "expected cookie %u, got %u", cookie1, cookie2); + + close_inotify(ifd); +} + ATF_TC_WITHOUT_HEAD(inotify_event_open); ATF_TC_BODY(inotify_event_open, tc) { @@ -858,6 +888,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, inotify_event_create); ATF_TP_ADD_TC(tp, inotify_event_delete); ATF_TP_ADD_TC(tp, inotify_event_move); + ATF_TP_ADD_TC(tp, inotify_event_move_dir); ATF_TP_ADD_TC(tp, inotify_event_open); ATF_TP_ADD_TC(tp, inotify_event_unmount); return (atf_no_error());
