Dominik,

I'm thinking you do not want to call
--
in->name[strlen(in->name)-1];
--
before testing for "if (in->len == 0"

Lonnie


On Feb 11, 2018, at 10:10 AM, Dominik Derigs <dl...@dl6er.de> wrote:

> 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
> 
> <inotfy.patch>_______________________________________________
> Dnsmasq-discuss mailing list
> Dnsmasq-discuss@lists.thekelleys.org.uk
> http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss


_______________________________________________
Dnsmasq-discuss mailing list
Dnsmasq-discuss@lists.thekelleys.org.uk
http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss

Reply via email to