• Andreas Gruenbacher's avatar
    dnotify: ignore FS_EVENT_ON_CHILD · 94552684
    Andreas Gruenbacher authored
    Mask off FS_EVENT_ON_CHILD in dnotify_handle_event().  Otherwise, when there
    is more than one watch on a directory and dnotify_should_send_event()
    succeeds, events with FS_EVENT_ON_CHILD set will trigger all watches and cause
    spurious events.
    
    This case was overlooked in commit e42e2773.
    
    	#define _GNU_SOURCE
    
    	#include <stdio.h>
    	#include <stdlib.h>
    	#include <unistd.h>
    	#include <signal.h>
    	#include <sys/types.h>
    	#include <sys/stat.h>
    	#include <fcntl.h>
    	#include <string.h>
    
    	static void create_event(int s, siginfo_t* si, void* p)
    	{
    		printf("create\n");
    	}
    
    	static void delete_event(int s, siginfo_t* si, void* p)
    	{
    		printf("delete\n");
    	}
    
    	int main (void) {
    		struct sigaction action;
    		char *tmpdir, *file;
    		int fd1, fd2;
    
    		sigemptyset (&action.sa_mask);
    		action.sa_flags = SA_SIGINFO;
    
    		action.sa_sigaction = create_event;
    		sigaction (SIGRTMIN + 0, &action, NULL);
    
    		action.sa_sigaction = delete_event;
    		sigaction (SIGRTMIN + 1, &action, NULL);
    
    	#	define TMPDIR "/tmp/test.XXXXXX"
    		tmpdir = malloc(strlen(TMPDIR) + 1);
    		strcpy(tmpdir, TMPDIR);
    		mkdtemp(tmpdir);
    
    	#	define TMPFILE "/file"
    		file = malloc(strlen(tmpdir) + strlen(TMPFILE) + 1);
    		sprintf(file, "%s/%s", tmpdir, TMPFILE);
    
    		fd1 = open (tmpdir, O_RDONLY);
    		fcntl(fd1, F_SETSIG, SIGRTMIN);
    		fcntl(fd1, F_NOTIFY, DN_MULTISHOT | DN_CREATE);
    
    		fd2 = open (tmpdir, O_RDONLY);
    		fcntl(fd2, F_SETSIG, SIGRTMIN + 1);
    		fcntl(fd2, F_NOTIFY, DN_MULTISHOT | DN_DELETE);
    
    		if (fork()) {
    			/* This triggers a create event */
    			creat(file, 0600);
    			/* This triggers a create and delete event (!) */
    			unlink(file);
    		} else {
    			sleep(1);
    			rmdir(tmpdir);
    		}
    
    		return 0;
    	}
    Signed-off-by: default avatarAndreas Gruenbacher <agruen@suse.de>
    Signed-off-by: default avatarEric Paris <eparis@redhat.com>
    94552684
dnotify.c 12.1 KB