From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: =?UTF-8?Q?=C5=A0t=C4=9Bp=C3=A1n_?= =?UTF-8?Q?N=C4=9Bmec?= Newsgroups: gmane.emacs.bugs Subject: bug#39980: [PATCH] gnus-shorten-url: Improve and avoid args-out-of-range error Date: Sun, 8 Mar 2020 10:06:30 +0100 Message-ID: <20200308090630.41238-1-stepnem@gmail.com> Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="51705"; mail-complaints-to="usenet@ciao.gmane.io" To: 39980@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Mar 08 10:07:14 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jArty-000DM3-Mw for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 08 Mar 2020 10:07:14 +0100 Original-Received: from localhost ([::1]:56098 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jArtx-0008Gs-Ad for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 08 Mar 2020 05:07:13 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:54113) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jArto-0008Gl-5Z for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:07:05 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jArtm-00079F-RW for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:07:04 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:41914) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jArtm-000793-OL for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:07:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jArtm-0000ue-Jd for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:07:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: =?UTF-8?Q?=C5=A0t=C4=9Bp=C3=A1n_?= =?UTF-8?Q?N=C4=9Bmec?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 08 Mar 2020 09:07:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 39980 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.15836583823456 (code B ref -1); Sun, 08 Mar 2020 09:07:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 8 Mar 2020 09:06:22 +0000 Original-Received: from localhost ([127.0.0.1]:47887 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jArt7-0000tf-N9 for submit@debbugs.gnu.org; Sun, 08 Mar 2020 05:06:22 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:59034) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jArt6-0000tW-9V for submit@debbugs.gnu.org; Sun, 08 Mar 2020 05:06:20 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:54039) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jArt4-0008F3-L0 for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:06:20 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jArt3-0006J7-2R for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:06:18 -0400 Original-Received: from mail-lf1-x131.google.com ([2a00:1450:4864:20::131]:34882) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jArt2-0006Ho-PN for bug-gnu-emacs@gnu.org; Sun, 08 Mar 2020 05:06:17 -0400 Original-Received: by mail-lf1-x131.google.com with SMTP id z9so5211834lfa.2 for ; Sun, 08 Mar 2020 01:06:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=QBAg1mBDZdRKohkxr6fHtzCzENWNWvydgjdbeAEQAmw=; b=npWb6I0ShyNRti3yz8cfXQycSITs4E8pJK+H14SI31INCPzfPJaL2Xzu2fhROmFzIY vpGYI6hO8WFbU6M8adLrM5aP9F3ZHr1VlAXcVgrzZ4eLeLcG6QvWSD9091FuUTDHEXQn o+hLyB8gEke4HuaibpzhEaIG0SI92CKzP6gE9rQWBJuK7HD4n/AMnDwuUkzGEwQd6o8R iiMa76whfUaWR4HylzwWcYY5AS6JBzFsBsfLMWGtucTlp+/sYOaYRdHpECivBKslQAUs v+9qYNv/7fMmZwg2WixUwk4RIgOUiTE8lgcVe91p1QR2vYgc0QYwM8ndeE/iDorPUTjZ UdFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=QBAg1mBDZdRKohkxr6fHtzCzENWNWvydgjdbeAEQAmw=; b=SBsPlksSlx2CgSM5qzmXyRH9IdlMM1KiCu8bnanZABeH5uOl4sJ2pDRsVevHIMbpCL dAnOgZSkxUKqSrydgbx+RuWJd3CZztFyo1tcU+YUIaRPfYMMnLeeR5wW1a76zkpx9+MQ W9D3Re4uRg+bllsNiW24QTPl3uAuhgGFyfLfJhwFMEtDw8BgG96fVnyFgVGsZdxFsCm5 W8/sozfTntHfbgfDr6mH6nMct7yuttPMYy3CWvKUC4nYtTIZ+ZVa9nsBeisX/i1GOhNf tg0ZeewYVaD3z24aMDYVOTzNgIzrbI9uGk6IIy5q48I1v+LxBJmNdxuio1nm2zxosS9n v1tQ== X-Gm-Message-State: ANhLgQ2mq/XJjcR5uYJElWNcY45M+UwGsPrmS/Y87O8ZEQW5EKVxZHgF UkkNd96LpmPVNovTtEw7bYtuSHQV X-Google-Smtp-Source: ADFU+vvHihZ4CkDX2CUP/ldHo5OWDj16yuWMgBZpY6BUC0pexC8/fjPq2SWPyYDOWh9kgcNEwXU89A== X-Received: by 2002:ac2:43c8:: with SMTP id u8mr6395043lfl.180.1583658374350; Sun, 08 Mar 2020 01:06:14 -0800 (PST) Original-Received: from localhost ([185.112.167.59]) by smtp.gmail.com with ESMTPSA id s16sm10281088ljs.65.2020.03.08.01.06.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 08 Mar 2020 01:06:13 -0800 (PST) X-Mailer: git-send-email 2.25.1 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:177044 Archived-At: 'gnus-shorten-url' (used by 'gnus-summary-browse-url') ignored fragment identifiers and didn't check substring bounds, in some cases leading to runtime errors, e.g.: (gnus-shorten-url "https://some.url.with/path/and#also_a_long_target" 40) ;; => Lisp error: (args-out-of-range "/path/and" -18 nil) This commit makes it account for #fragments and fixes faulty string computation, reusing existing helper function. * lisp/vc/ediff-init.el (ediff-truncate-string-left): Rename to 'string-truncate-left'. * lisp/emacs-lisp/subr-x.el (string-truncate-left): Move here. * lisp/vc/ediff-mult.el (ediff-meta-insert-file-info1) (ediff-draw-dir-diffs): 'ediff-draw-dir-diffs' renamed to 'string-truncate-left'. * lisp/gnus/gnus-sum.el (gnus-shorten-url): Fix args-out-of-range error, don't drop #fragments, use 'string-truncate-left'. --- lisp/emacs-lisp/subr-x.el | 8 ++++++++ lisp/gnus/gnus-sum.el | 14 +++++++------- lisp/vc/ediff-init.el | 10 ---------- lisp/vc/ediff-mult.el | 10 ++++++---- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el index 044c9aada0..baf20131cc 100644 --- a/lisp/emacs-lisp/subr-x.el +++ b/lisp/emacs-lisp/subr-x.el @@ -236,6 +236,14 @@ string-trim TRIM-LEFT and TRIM-RIGHT default to \"[ \\t\\n\\r]+\"." (string-trim-left (string-trim-right string trim-right) trim-left)) +(defsubst string-truncate-left (string length) + "Truncate STRING to LENGTH, replacing initial surplus with \"...\"." + (let ((strlen (length string))) + (if (<= strlen length) + string + (setq length (max 0 (- length 3))) + (concat "..." (substring string (max 0 (- strlen 1 length))))))) + (defsubst string-blank-p (string) "Check whether STRING is either empty or only whitespace. The following characters count as whitespace here: space, tab, newline and diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index a47e657623..6f367692dd 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -9494,15 +9494,15 @@ gnus-collect-urls (delete-dups urls))) (defun gnus-shorten-url (url max) - "Return an excerpt from URL." + "Return an excerpt from URL not exceeding MAX characters." (if (<= (length url) max) url - (let ((parsed (url-generic-parse-url url))) - (concat (url-host parsed) - "..." - (substring (url-filename parsed) - (- (length (url-filename parsed)) - (max (- max (length (url-host parsed))) 0))))))) + (let* ((parsed (url-generic-parse-url url)) + (host (url-host parsed)) + (rest (concat (url-filename parsed) + (when-let ((target (url-target parsed))) + (concat "#" target))))) + (concat host (string-truncate-left rest (- max (length host))))))) (defun gnus-summary-browse-url (&optional external) "Scan the current article body for links, and offer to browse them. diff --git a/lisp/vc/ediff-init.el b/lisp/vc/ediff-init.el index cbd8c0d322..c7498064dc 100644 --- a/lisp/vc/ediff-init.el +++ b/lisp/vc/ediff-init.el @@ -1524,16 +1524,6 @@ ediff-strip-last-dir (setq dir (substring dir 0 pos))) (ediff-abbreviate-file-name (file-name-directory dir)))) -(defun ediff-truncate-string-left (str newlen) - ;; leave space for ... on the left - (let ((len (length str)) - substr) - (if (<= len newlen) - str - (setq newlen (max 0 (- newlen 3))) - (setq substr (substring str (max 0 (- len 1 newlen)))) - (concat "..." substr)))) - (defsubst ediff-nonempty-string-p (string) (and (stringp string) (not (string= string "")))) diff --git a/lisp/vc/ediff-mult.el b/lisp/vc/ediff-mult.el index fee87e8352..5dcb42eb64 100644 --- a/lisp/vc/ediff-mult.el +++ b/lisp/vc/ediff-mult.el @@ -113,6 +113,8 @@ ediff-mult (require 'ediff-wind) (require 'ediff-util) +(eval-when-compile + (require 'subr-x)) ; string-truncate-left ;; meta-buffer (ediff-defvar-local ediff-meta-buffer nil "") @@ -1172,7 +1174,7 @@ ediff-meta-insert-file-info1 ;; abbreviate the file name, if file exists (if (and (not (stringp fname)) (< file-size -1)) "-------" ; file doesn't exist - (ediff-truncate-string-left + (string-truncate-left (ediff-abbreviate-file-name fname) max-filename-width))))))) @@ -1266,7 +1268,7 @@ ediff-draw-dir-diffs (if (= (mod membership-code ediff-membership-code1) 0) ; dir1 (let ((beg (point))) (insert (format "%-27s" - (ediff-truncate-string-left + (string-truncate-left (ediff-abbreviate-file-name (if (file-directory-p (concat dir1 file)) (file-name-as-directory file) @@ -1281,7 +1283,7 @@ ediff-draw-dir-diffs (if (= (mod membership-code ediff-membership-code2) 0) ; dir2 (let ((beg (point))) (insert (format "%-26s" - (ediff-truncate-string-left + (string-truncate-left (ediff-abbreviate-file-name (if (file-directory-p (concat dir2 file)) (file-name-as-directory file) @@ -1295,7 +1297,7 @@ ediff-draw-dir-diffs (if (= (mod membership-code ediff-membership-code3) 0) ; dir3 (let ((beg (point))) (insert (format " %-25s" - (ediff-truncate-string-left + (string-truncate-left (ediff-abbreviate-file-name (if (file-directory-p (concat dir3 file)) (file-name-as-directory file) -- 2.25.1