diff options
author | Filipp Gunbin <fgunbin@fastmail.fm> | 2016-10-26 14:31:12 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2016-10-26 14:31:12 -0400 |
commit | 4e45b55a9566189af6e40449954504ea7c47fa90 (patch) | |
tree | 79a6e472f68ec320cc0128eb15ec42e78eb58cbb | |
parent | 5edf76ba15fb012e9cb3112ee4a2c9ef4b02f20e (diff) | |
download | emacs-4e45b55a9566189af6e40449954504ea7c47fa90.tar.gz |
* 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.") ((eq (aref qstr match) ?\") (setq dquotes (not dquotes))) ((eq (aref qstr match) ?\') (cond + ;; Treat single quote as text if inside double quotes. (dquotes (funcall push "'" (match-end 0))) - ((< match (1+ (length qstr))) + ((< (1+ match) (length qstr)) (let ((end (string-match "'" qstr (1+ match)))) - (funcall push (substring qstr (1+ match) end) - (or end (length qstr))))) + (unless end + (setq end (length qstr)) + (set-match-data (list match (length qstr)))) + (funcall push (substring qstr (1+ match) end) end))) + ;; Ignore if at the end of string. (t nil))) (t (error "Unexpected case in shell--unquote&requote-argument!"))) (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 @@ +;;; shell-tests.el -*- lexical-binding:t -*- + +;; Copyright (C) 2010-2016 Free Software Foundation, Inc. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: + +;; Tests for comint and related modes. + +;;; Code: + +(require 'shell) +(require 'ert) + +(ert-deftest shell-tests-unquote-1 () + "Test problem found by Filipp Gunbin in emacs-devel." + (should (equal (car (shell--unquote&requote-argument "te'st" 2)) "test"))) + +;;; shell-tests.el ends here |