From 4e45b55a9566189af6e40449954504ea7c47fa90 Mon Sep 17 00:00:00 2001 From: Filipp Gunbin Date: Wed, 26 Oct 2016 14:31:12 -0400 Subject: [PATCH] * 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. --- lisp/shell.el | 10 +++++++--- test/lisp/shell-tests.el | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 test/lisp/shell-tests.el 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 . + +;;; 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 -- 2.39.5