diff options
| author | Philipp Stephani | 2016-10-12 22:48:32 +0200 |
|---|---|---|
| committer | Philipp Stephani | 2016-10-13 13:00:48 +0200 |
| commit | 8ee95221c7112a763ae6ce41c7c58b3c32ece5fc (patch) | |
| tree | 780fef85d03762e91361b962c1da769a821f4edd | |
| parent | b0f1d23ec482aa71a0ae0251f6f44f4b8d261259 (diff) | |
| download | emacs-8ee95221c7112a763ae6ce41c7c58b3c32ece5fc.tar.gz emacs-8ee95221c7112a763ae6ce41c7c58b3c32ece5fc.zip | |
Fix crash in evaluating functions
See Bug#24673
* src/eval.c (funcall_lambda): Fix crash for bogus functions such
as (closure).
* test/src/eval-tests.el (eval-tests--bug24673): Add test.
| -rw-r--r-- | src/eval.c | 6 | ||||
| -rw-r--r-- | test/src/eval-tests.el | 35 |
2 files changed, 39 insertions, 2 deletions
diff --git a/src/eval.c b/src/eval.c index 2fedbf377cf..a9bad2491fa 100644 --- a/src/eval.c +++ b/src/eval.c | |||
| @@ -2841,9 +2841,11 @@ funcall_lambda (Lisp_Object fun, ptrdiff_t nargs, | |||
| 2841 | { | 2841 | { |
| 2842 | if (EQ (XCAR (fun), Qclosure)) | 2842 | if (EQ (XCAR (fun), Qclosure)) |
| 2843 | { | 2843 | { |
| 2844 | fun = XCDR (fun); /* Drop `closure'. */ | 2844 | Lisp_Object cdr = XCDR (fun); /* Drop `closure'. */ |
| 2845 | if (! CONSP (cdr)) | ||
| 2846 | xsignal1 (Qinvalid_function, fun); | ||
| 2847 | fun = cdr; | ||
| 2845 | lexenv = XCAR (fun); | 2848 | lexenv = XCAR (fun); |
| 2846 | CHECK_LIST_CONS (fun, fun); | ||
| 2847 | } | 2849 | } |
| 2848 | else | 2850 | else |
| 2849 | lexenv = Qnil; | 2851 | lexenv = Qnil; |
diff --git a/test/src/eval-tests.el b/test/src/eval-tests.el new file mode 100644 index 00000000000..75999e1a25a --- /dev/null +++ b/test/src/eval-tests.el | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | ;;; eval-tests.el --- unit tests for src/eval.c -*- lexical-binding: t; -*- | ||
| 2 | |||
| 3 | ;; Copyright (C) 2016 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Philipp Stephani <phst@google.com> | ||
| 6 | |||
| 7 | ;; This file is part of GNU Emacs. | ||
| 8 | |||
| 9 | ;; GNU Emacs is free software: you can redistribute it and/or modify | ||
| 10 | ;; it under the terms of the GNU General Public License as published by | ||
| 11 | ;; the Free Software Foundation, either version 3 of the License, or | ||
| 12 | ;; (at your option) any later version. | ||
| 13 | |||
| 14 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 15 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 17 | ;; GNU General Public License for more details. | ||
| 18 | |||
| 19 | ;; You should have received a copy of the GNU General Public License | ||
| 20 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | ||
| 21 | |||
| 22 | ;;; Commentary: | ||
| 23 | |||
| 24 | ;; Unit tests for src/eval.c. | ||
| 25 | |||
| 26 | ;;; Code: | ||
| 27 | |||
| 28 | (require 'ert) | ||
| 29 | |||
| 30 | (ert-deftest eval-tests--bug24673 () | ||
| 31 | "Checks that Bug#24673 has been fixed." | ||
| 32 | ;; This should not crash. | ||
| 33 | (should-error (funcall '(closure)) :type 'invalid-function)) | ||
| 34 | |||
| 35 | ;;; eval-tests.el ends here | ||