mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2026-10-24 00:49:00 +03:00
inotify watches are keyed by inode, so watching a directory (or file) through two different paths that resolve to the same inode - e.g. a real path and a symlink alias - returns the same watch descriptor (wd). The backend already tracks this by keeping a GList of watched dirs/files per wd. However, when a monitor was cancelled, _ip_stop_watching() (and likewise ip_watched_file_stop()) called _ik_ignore() -> inotify_rm_watch() as soon as that particular path had no subscribers, without checking whether any other path still shared the same wd. This tore down the single kernel watch out from under the still-active monitors on the other path: they kept reporting g_file_monitor_is_cancelled() == FALSE but silently stopped receiving events. Only remove the kernel watch once no other watched directory/file still references the wd, by removing our own entry from the wd hash first and issuing _ik_ignore() only when the list has become empty. Add a regression test covering cancellation of a directory monitor established through a symlink alias. Fixes: https://gitlab.gnome.org/GNOME/glib/-/issues/4055