Subject: Re: bug#29450: 26.0.90; No check for nil in some filenotify functions

From: Eli Zaretskii <[email-masked]>
Date: Sun, 26 Nov 2017 17:39:31 +0200

> From: "John Wiegley" <[email-masked]>
> Date: Sat, 25 Nov 2017 22:18:07 -0800
> 
> The documentation for find-file-name-handler says:
> 
>     find-file-name-handler is a built-in function in ‘C source code’.
>     
>     (find-file-name-handler FILENAME OPERATION)
>     
>     Return FILENAME’s handler function for OPERATION, if it has one.
>     Otherwise, return nil.
> 
> However, several of the functions in filenotify use the return value of this
> function without checking if it's nil or not:

Maybe I'm blind, but I cannot find any place in filenotify where the
handler is used without checking, including in the case you show:

>     (defun file-notify-rm-watch (descriptor)
>       "Remove an existing watch specified by its DESCRIPTOR.
>     DESCRIPTOR should be an object returned by `file-notify-add-watch'."
>       (when-let* ((watch (gethash descriptor file-notify-descriptors)))
>         (let ((handler (find-file-name-handler
>                         (file-notify--watch-directory watch)
>                         'file-notify-rm-watch)))
>           (condition-case nil
>               (if handler <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>                   ;; A file name handler could exist even if there is no
>                   ;; local file notification support.
>                   (funcall handler 'file-notify-rm-watch descriptor)

What am I missing?

> I've been getting several errors with a backtrace like nil(48). This is likely
> because some package has done something wrong, but even still, filenotify
> should be more defensive.

Can you show a full backtrace like that?