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, 12 Apr 2020 22:02:18 +0200 Message-ID: <87d08cbhh1.fsf@gmail.com> References: <20200308090630.41238-1-stepnem@gmail.com> <87pndf17v5.fsf@gnus.org> <87zhcinbdl.fsf@gmail.com> <87d09ezudv.fsf@gnus.org> <83zhciby6s.fsf@gnu.org> <87imioo963.fsf@gmail.com> <875zeinoc0.fsf@gnus.org> <87wo6lc9n8.fsf@gmail.com> <83blnxkn7i.fsf@gnu.org> <87o8rxc72a.fsf@gmail.com> <83a73hklq3.fsf@gnu.org> <87k12lc4dz.fsf@gmail.com> <838sj0lt72.fsf@gnu.org> <873698dc70.fsf@gmail.com> <834ktolqks.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="78614"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: larsi@gnus.org, 39980@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Apr 12 22:02:12 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 1jNinz-000KLi-QZ for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 12 Apr 2020 22:02:11 +0200 Original-Received: from localhost ([::1]:36480 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jNiny-0004PP-Gs for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 12 Apr 2020 16:02:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:35551) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jNinq-0004P9-TC for bug-gnu-emacs@gnu.org; Sun, 12 Apr 2020 16:02:03 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jNinp-0005le-Ol for bug-gnu-emacs@gnu.org; Sun, 12 Apr 2020 16:02:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:47393) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jNinp-0005lX-Lb for bug-gnu-emacs@gnu.org; Sun, 12 Apr 2020 16:02:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jNinp-0001hg-Ix for bug-gnu-emacs@gnu.org; Sun, 12 Apr 2020 16:02:01 -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, 12 Apr 2020 20:02:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 39980 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 39980-submit@debbugs.gnu.org id=B39980.15867217126529 (code B ref 39980); Sun, 12 Apr 2020 20:02:01 +0000 Original-Received: (at 39980) by debbugs.gnu.org; 12 Apr 2020 20:01:52 +0000 Original-Received: from localhost ([127.0.0.1]:58939 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jNing-0001hF-Br for submit@debbugs.gnu.org; Sun, 12 Apr 2020 16:01:52 -0400 Original-Received: from mail-lj1-f196.google.com ([209.85.208.196]:38209) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jNind-0001gy-OT for 39980@debbugs.gnu.org; Sun, 12 Apr 2020 16:01:50 -0400 Original-Received: by mail-lj1-f196.google.com with SMTP id v16so6905517ljg.5 for <39980@debbugs.gnu.org>; Sun, 12 Apr 2020 13:01:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version; bh=aaLyXyiG7a2SA798/HFDTWFcYWgJf1HRqLjaZebGbc0=; b=W4aCdNDUEkLcHtYuuooKVEMwk7S/c5MjSjxmiaKk/DEyrnsIRQTHZFti/wfSkLdjD2 wOWGYiPSTTxCFUOWWJJLltBfaAdnLvd3AdLUVu+0RReY3+MKDH5LcGUwfiTRsGz8nJ5B X3pGQg/ttpIM74b9FRykhkdRf8Jc7N2kQYO9ByRjpnmI+N9BvguCXBUZKHNbGZbQvi0c fu+riaWZgQuEfRTl/vR6Bh0N3wywwjSVgQPmePEo1gbvLkFjrKYEYwQLir4DKCsc6Rb0 fxkcfcLaSZZNWkOxk6ilJ1bGnPynZj6c4NqMnoiFoy7J83BoWSe7p7XOgusd3Abf/6kO kfnw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references :user-agent:date:message-id:mime-version; bh=aaLyXyiG7a2SA798/HFDTWFcYWgJf1HRqLjaZebGbc0=; b=Boi3wRBqgOdjOAGnqxbtHa9rw6aaKbeajx0wlh6QRxfRy9IKGZ+pgxPfE0ptYFJ9SN TNfe2/U2vyt9crI17jGU82dlcAReASQ3OyAL1dkoLa7KX3yLjDGq3JsMYHMNZneCA2qc hkK+j2y6NrvT1srcgvc6XhYAszrHAKlMYPRWNqL5U6kE8J4RNQCqTrKNSCZmbEegbkPn xUijrTG32NcOIR75dFboBYi6JE39mAE8IuwyWUvlbsS8tbFXbxNzu6Q5IttjJZt71K9o CvSOpOQBEFuV6UXMr64fJwPR6X+RlymvVhYM2MUbrgGkAAlO8xaGsJrjC0wtJiRdDdqZ Fo7A== X-Gm-Message-State: AGi0PubLZvp9F6cx9dojSX+Ix4P+pFUQnkUouPRs0XMy5mGYW0k4xNqi NY2M+qCtzG9AzmXCh8BTX5U= X-Google-Smtp-Source: APiQypI2ITJ9upfoNPi/AVzQodZwDaqe5cq2Uij6QJ2mCaXfECG5HZ2fBMD0ip55FvRcLUXs1BBLWw== X-Received: by 2002:a2e:5048:: with SMTP id v8mr7960200ljd.99.1586721703695; Sun, 12 Apr 2020 13:01:43 -0700 (PDT) Original-Received: from localhost ([185.112.167.47]) by smtp.gmail.com with ESMTPSA id z4sm5835091ljk.51.2020.04.12.13.01.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Apr 2020 13:01:42 -0700 (PDT) In-Reply-To: <834ktolqks.fsf@gnu.org> (Eli Zaretskii's message of "Sun, 12 Apr 2020 17:35:31 +0300") 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:178278 Archived-At: --=-=-= Content-Type: text/plain On Sun, 12 Apr 2020 17:35:31 +0300 Eli Zaretskii wrote: > Let's just come up with a local change in gnus-sum, for the emacs-27 > branch, okay? OK. I think the pat(c)h of least resistence would be as follows (everything just the same as for master, but with the helper function localized to gnus-sum and no changes to other files): --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-gnus-shorten-url-Improve-and-avoid-args-out-of-range.patch >From 9fd1f20078220c17f9e954b556c6b770ca70961a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20N=C4=9Bmec?= Date: Sun, 12 Apr 2020 19:57:59 +0200 Subject: [PATCH] gnus-shorten-url: Improve and avoid args-out-of-range error '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. (bug#39980) ; Do not merge to master, where the helper is put to subr-x.el. * lisp/gnus/gnus-sum.el (gnus--string-truncate-left): New helper function (copied from 'ediff-truncate-string-left'). (gnus-shorten-url): Use it and don't drop #fragments. --- lisp/gnus/gnus-sum.el | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el index a40e563e75..9b11d5878d 100644 --- a/lisp/gnus/gnus-sum.el +++ b/lisp/gnus/gnus-sum.el @@ -9493,16 +9493,26 @@ gnus-collect-urls (push primary urls)) (delete-dups urls))) +;; cf. `ediff-truncate-string-left', to become `string-truncate-left' +;; in Emacs 28 +(defun gnus--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))))))) + (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 (gnus--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. -- 2.26.0 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 DQotLSANCsWgdMSbcMOhbg0K --=-=-=--