summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-03-30 11:08:23 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2017-03-30 11:08:42 -0700
commit6ff870218dd4bc015cc4115ceb2febd8d807e57c (patch)
tree67eaa089c0754194e75eea898e24c4a6bcfbe91a /test
parent1be3330b31f9c0d0d0f7d25641e8b81c807ca616 (diff)
downloademacs-6ff870218dd4bc015cc4115ceb2febd8d807e57c.tar.gz
Some inotify cleanup
This catches some problems with integer overflow and races that I noticed in inotify.c after reviewing the changes installed to fix Bug#26126. * src/fns.c, src/lisp.h (equal_no_quit): Now extern. * src/inotify.c (aspect_to_inotifymask): Check for cycles and for improper lists. (make_lispy_mask, lispy_mask_match_p): Remove. All callers changed to use INTEGER_TO_CONS and CONS_TO_INTEGER. (inotifyevent_to_event, add_watch): Don’t assume watch descriptors and cookies fit in fixnums. (add_watch): Use assoc_no_quit, not Fassoc. Avoid integer overflow in (very!) long-running processes where the Emacs watch ID could overflow. Avoid some duplicate code. (find_descriptor): New function. (remove_descriptor): First arg is now the returned value from find_descriptor, rather than the descriptor. This way, the value can be removed without calling Fdelete, which might quit. Wait until the end (when watch_list is consistent) before signaling any errors. (remove_watch, inotify_callback): Use find_descriptor to avoid the need for Fdelete. (inotify_callback): Use simpler tests for ioctl failure. Free temporary buffer if signaled, and put it on the stack if small. Use ssize_t to index through read results, to avoid a cast. (valid_watch_descriptor): New function, with a tighter check. (Finotify_rm_watch, Finotify_valid_p): Use it. (Finotify_valid_p): Use assoc_no_quit and ass_no_quit instead of Fassoc. Do not assume the first assoc succeeds. * test/src/inotify-tests.el (inotify-valid-p-simple): Add inotify-valid-p tests, some of which dump core without the fixes noted above.
Diffstat (limited to 'test')
-rw-r--r--test/src/inotify-tests.el9
1 files changed, 9 insertions, 0 deletions
diff --git a/test/src/inotify-tests.el b/test/src/inotify-tests.el
index f30aecc9c4f..987e1fc0777 100644
--- a/test/src/inotify-tests.el
+++ b/test/src/inotify-tests.el
@@ -28,6 +28,13 @@
(declare-function inotify-add-watch "inotify.c" (file-name aspect callback))
(declare-function inotify-rm-watch "inotify.c" (watch-descriptor))
+(ert-deftest inotify-valid-p-simple ()
+ "Simple tests for `inotify-valid-p'."
+ (skip-unless (featurep 'inotify))
+ (should-not (inotify-valid-p 0))
+ (should-not (inotify-valid-p nil))
+ (should-not (inotify-valid-p '(0 . 0))))
+
;; (ert-deftest filewatch-file-watch-aspects-check ()
;; "Test whether `file-watch' properly checks the aspects."
;; (let ((temp-file (make-temp-file "filewatch-aspects")))
@@ -56,7 +63,9 @@
(insert "Foo\n"))
(read-event nil nil 5)
(should (> events 0)))
+ (should (inotify-valid-p wd))
(inotify-rm-watch wd)
+ (should-not (inotify-valid-p wd))
(delete-file temp-file)))))
(provide 'inotify-tests)