diff options
| author | Filipp Gunbin | 2016-10-26 14:31:12 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2016-10-26 14:31:12 -0400 |
| commit | 4e45b55a9566189af6e40449954504ea7c47fa90 (patch) | |
| tree | 79a6e472f68ec320cc0128eb15ec42e78eb58cbb | |
| parent | 5edf76ba15fb012e9cb3112ee4a2c9ef4b02f20e (diff) | |
| download | emacs-4e45b55a9566189af6e40449954504ea7c47fa90.tar.gz emacs-4e45b55a9566189af6e40449954504ea7c47fa90.zip | |
* lisp/shell.el (shell--unquote&requote-argument): Match data misuse
* lisp/shell.el (shell--unquote&requote-argument): Fix
off-by-one thinko. Don't use match data after a failed string-match.
| -rw-r--r-- | lisp/shell.el | 10 | ||||
| -rw-r--r-- | test/lisp/shell-tests.el | 33 |
2 files changed, 40 insertions, 3 deletions
diff --git a/lisp/shell.el b/lisp/shell.el index 1f019f20f3a..34bd77282ab 100644 --- a/lisp/shell.el +++ b/lisp/shell.el | |||
| @@ -384,11 +384,15 @@ Thus, this does not include the shell's current directory.") | |||
| 384 | ((eq (aref qstr match) ?\") (setq dquotes (not dquotes))) | 384 | ((eq (aref qstr match) ?\") (setq dquotes (not dquotes))) |
| 385 | ((eq (aref qstr match) ?\') | 385 | ((eq (aref qstr match) ?\') |
| 386 | (cond | 386 | (cond |
| 387 | ;; Treat single quote as text if inside double quotes. | ||
| 387 | (dquotes (funcall push "'" (match-end 0))) | 388 | (dquotes (funcall push "'" (match-end 0))) |
| 388 | ((< match (1+ (length qstr))) | 389 | ((< (1+ match) (length qstr)) |
| 389 | (let ((end (string-match "'" qstr (1+ match)))) | 390 | (let ((end (string-match "'" qstr (1+ match)))) |
| 390 | (funcall push (substring qstr (1+ match) end) | 391 | (unless end |
| 391 | (or end (length qstr))))) | 392 | (setq end (length qstr)) |
| 393 | (set-match-data (list match (length qstr)))) | ||
| 394 | (funcall push (substring qstr (1+ match) end) end))) | ||
| 395 | ;; Ignore if at the end of string. | ||
| 392 | (t nil))) | 396 | (t nil))) |
| 393 | (t (error "Unexpected case in shell--unquote&requote-argument!"))) | 397 | (t (error "Unexpected case in shell--unquote&requote-argument!"))) |
| 394 | (setq qpos (match-end 0))) | 398 | (setq qpos (match-end 0))) |
diff --git a/test/lisp/shell-tests.el b/test/lisp/shell-tests.el new file mode 100644 index 00000000000..be8f7d5c139 --- /dev/null +++ b/test/lisp/shell-tests.el | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | ;;; shell-tests.el -*- lexical-binding:t -*- | ||
| 2 | |||
| 3 | ;; Copyright (C) 2010-2016 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; This file is part of GNU Emacs. | ||
| 6 | |||
| 7 | ;; GNU Emacs is free software: you can redistribute it and/or modify | ||
| 8 | ;; it under the terms of the GNU General Public License as published by | ||
| 9 | ;; the Free Software Foundation, either version 3 of the License, or | ||
| 10 | ;; (at your option) any later version. | ||
| 11 | |||
| 12 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 13 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | ;; GNU General Public License for more details. | ||
| 16 | |||
| 17 | ;; You should have received a copy of the GNU General Public License | ||
| 18 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. | ||
| 19 | |||
| 20 | ;;; Commentary: | ||
| 21 | |||
| 22 | ;; Tests for comint and related modes. | ||
| 23 | |||
| 24 | ;;; Code: | ||
| 25 | |||
| 26 | (require 'shell) | ||
| 27 | (require 'ert) | ||
| 28 | |||
| 29 | (ert-deftest shell-tests-unquote-1 () | ||
| 30 | "Test problem found by Filipp Gunbin in emacs-devel." | ||
| 31 | (should (equal (car (shell--unquote&requote-argument "te'st" 2)) "test"))) | ||
| 32 | |||
| 33 | ;;; shell-tests.el ends here | ||