Forgot to attach the proposed patch. Best, Dominik
On 11.02.2018 17:02, Dominik Derigs wrote: > Hey Andy (and list), > > According to the inotify man page, the name buffer will always be > null-terminated. Furthermore, the name buffer seems to be allocated in > chunks of 16 bytes. I have not found an official confirmation for that. > > I the way to go would be: char lastchar = in->name[strlen(in->name)-1]; > > I have extended your test code by the following two lines: > > if(in->name == NULL) continue; > printf("DD: strlen: %lu\n", strlen(in->name)); > char lastchar = in->name[strlen(in->name)-1]; > printf("DD: strlen last char: %c\n", lastchar); > > Here are results obtained with your + my debug output: > > For a short filename without ~ > > ADH: len: 16 > ADH: name: shortfilename > ADH: last char: > DD: strlen: 13 > DD: strlen last char: e > > For a short filename with ~ > > ADH: len: 16 > ADH: name: shortfilename~ > ADH: last char: > DD: strlen: 14 > DD: strlen last char: ~ > > For a long filename without ~ > > ADH: len: 32 > ADH: name: veryverylongfilename > ADH: last char: > DD: strlen: 20 > DD: strlen last char: e > > For a long filename with ~ > > ADH: len: 32 > ADH: name: veryverylongfilename~ > ADH: last char: > DD: strlen: 21 > DD: strlen last char: ~ > > Best regards, > Dominik > > > On 11.02.2018 12:57, Andy Hawkins wrote: >> Hi, >> >> In article <slrnp80aau.nkj.a...@xcp-mailnews.gently.org.uk>, >> Andy Hawkins<a...@gently.org.uk> wrote: >>> In inotify.c, around line 236 is the following code block: >>> >>> /* ignore emacs backups and dotfiles */ >>> if (in->len == 0 || >>> in->name[in->len - 1] == '~' || >>> (in->name[0] == '#' && in->name[in->len - 1] == '#') || >>> in->name[0] == '.') >>> continue; >>> >>> However, if I create a file called 'fred~' in the directory I've specified >>> using dhcp-hostsdir I still get an event in syslog that shows this file is >>> being processed: >>> >>> Feb 11 11:14:34 xcp-gateway dnsmasq[1039]: inotify, new or changed file >>> /etc/dnsmasq/dhcp-hosts.d/fred~ >> Ok, I've done some debugging. I added the following lines: >> >> my_syslog(LOG_INFO, "ADH: len: %d", in->len); >> my_syslog(LOG_INFO, "ADH: name: %s", in->name); >> my_syslog(LOG_INFO, "ADH: last char: %c", in->name[in->len - 1]); >> >> And I get the following output: >> >> dnsmasq: ADH: len: 16 >> dnsmasq: ADH: name: fred4~ >> dnsmasq: ADH: last char: >> >> So, it appears that the length in in->len is being interpreted correctly. >> >> According to the inotify man page: >> >> The len field counts all of the bytes in name, including the null >> bytes; the length of each inotify_event structure is thus >> sizeof(struct inotify_event)+len. >> >> So in fact, 'len' seems to be a fixed length, irrespective of the length of >> the file name in the 'name' field. >> >> It looks like the check should actually be something like: >> >> /* ignore emacs backups and dotfiles */ >> if (in->len == 0 || >> in->name[strlen(in->name) - 1] == '~' || >> (in->name[0] == '#' && in->name[strlen(in->name) - 1] == '#') >> || >> in->name[0] == '.') >> >> I guess you may need to check that there's a null in the name somewhere >> before using strlen, otherwise you might end up running off the end of the >> string. I don't know inotify well enough to know if there's guaranteed to be >> a null in there somewhere. The manpage does say that the name field is null >> terminated, but I don't know if that's guaranteed or not. >> >> I could have a look at submitting a patch, but my editor is showing some >> very strange indentation of the source, so I suspect I have my tab settings >> incorrect. What is the standard setting for tabs on the dnasmasq source >> files? >> >> Thanks >> >> Andy >> >> >> _______________________________________________ >> Dnsmasq-discuss mailing list >> Dnsmasq-discuss@lists.thekelleys.org.uk >> http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
diff --git a/inotify.c b/inotify.c index b5a17dd..51d13be 100644 --- a/inotify.c +++ b/inotify.c @@ -234,9 +234,10 @@ int inotify_check(time_t now) hit = 1; /* ignore emacs backups and dotfiles */ + char lastchar = in->name[strlen(in->name)-1]; if (in->len == 0 || - in->name[in->len - 1] == '~' || - (in->name[0] == '#' && in->name[in->len - 1] == '#') || + lastchar == '~' || + (in->name[0] == '#' && lastchar == '#') || in->name[0] == '.') continue;
_______________________________________________ Dnsmasq-discuss mailing list Dnsmasq-discuss@lists.thekelleys.org.uk http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss