aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFilipp Gunbin2016-10-26 14:31:12 -0400
committerStefan Monnier2016-10-26 14:31:12 -0400
commit4e45b55a9566189af6e40449954504ea7c47fa90 (patch)
tree79a6e472f68ec320cc0128eb15ec42e78eb58cbb
parent5edf76ba15fb012e9cb3112ee4a2c9ef4b02f20e (diff)
downloademacs-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.el10
-rw-r--r--test/lisp/shell-tests.el33
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