unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: "J.P." <jp@neverwas.me>
To: Fernando de Morais <fernandodemorais.jf@gmail.com>
Cc: "Mattias Engdegård" <mattiase@acm.org>,
	"Eli Zaretskii" <eliz@gnu.org>,
	emacs-erc@gnu.org, bandali@gnu.org, 54458@debbugs.gnu.org
Subject: bug#54458: 27.2; erc-dcc-get: Re-entering top level after C stack overflow
Date: Fri, 06 May 2022 06:06:15 -0700	[thread overview]
Message-ID: <874k22zu7s.fsf__15427.6849397988$1651842659$gmane$org@neverwas.me> (raw)
In-Reply-To: <87pmkth2lr.fsf@gmail.com> (Fernando de Morais's message of "Wed,  04 May 2022 10:03:12 -0300")

[-- Attachment #1: Type: text/plain, Size: 1840 bytes --]

Hi Fernando,

Fernando de Morais <fernandodemorais.jf@gmail.com> writes:

> It worked great! I was able to download four packages simultaneously,
> making use of the `-t' flag, without losing control of Emacs.
>
> In fact, the loss of control still happened a few times, even using the
> flag, but for a short time and much more rarely

Hm. I'm not sure what all we can do about the stuttering. The flag
inhibits all sending, so the filter is merely appending arriving bytes
to the work buffer and flushing it whenever its size crosses some
threshold. IOW, the EAGAIN loop discussed up thread can't occur. So,
whatever's causing the intermittent loss must be related to normal,
interleaved reading by those filters.

And without more insight into what's going on precisely with your
inputs, I don't think there's a whole lot we can do beyond speculate.
So, in the end, I guess I'm just asking you to suffer the status quo on
this one.

> [...] compared to the transfer without the flag (whose loss of control
> happens in, practically, every transfer).

Right. The sans-flag thing was another dumb idea you should have been
spared. In truth, it never stood a chance (I've come to learn) because
no one has ever implemented that form of TSEND. However, I've added
detection for one form that does exist and is very much in use, at least
by KVirc folk. I've also added a slight tweak for improved interop with
WeeChat, which has its own form of turbo (called "fast mode" or
something) that only requires a final ACK.

If you're able to try these, great. If not, no worries. I'll leave them
for a bit anyhow to focus on our main initiatives. Thanks for bearing
with me all these weeks (and with ERC all these years)!

J.P.

P.S (unrelated) I've also added SSEND detection (and an -s flag) for
senders that support it (it's just TLS, really).


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0000-v4-v5.diff --]
[-- Type: text/x-patch, Size: 13123 bytes --]

From 32b268f03891c297b14bbaee45833d33fe051c17 Mon Sep 17 00:00:00 2001
From: "F. Jason Park" <jp@neverwas.me>
Date: Fri, 6 May 2022 00:15:36 -0700
Subject: [PATCH 0/5] *** NOT A PATCH ***

*** BLURB HERE ***

F. Jason Park (5):
  Display error message on incomplete ERC DCC transfer
  Don't send reports in erc-dcc-get-filter when nested
  Allow matching against string values in erc-dcc-member
  Accept turbo param in erc-dcc-do-GET-command
  Support receiving from DCC SSEND in erc-dcc

 lisp/erc/erc-dcc.el            | 135 ++++++++++++++++++---------
 test/lisp/erc/erc-dcc-tests.el | 164 +++++++++++++++++++++++++++++++++
 2 files changed, 258 insertions(+), 41 deletions(-)
 create mode 100644 test/lisp/erc/erc-dcc-tests.el

Interdiff:
diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index cfa8422b1c..aa48be4dde 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -43,7 +43,7 @@
 ;;  /dcc chat nick - Either accept pending chat offer from nick, or offer
 ;;                   DCC chat to nick
 ;;  /dcc close type [nick] - Close DCC connection (SEND/GET/CHAT) with nick
-;;  /dcc get [-t] nick [file] - Accept DCC offer from nick
+;;  /dcc get [-t][-s] nick [file] - Accept DCC offer from nick
 ;;  /dcc list - List all DCC offers/connections
 ;;  /dcc send nick file - Offer DCC SEND to nick
 
@@ -107,7 +107,9 @@ erc-dcc-list
 
  :size - size of the file, may be nil on incoming DCCs
 
- :turbo - optional item indicating sender support for TSEND.")
+ :secure - optional item indicating sender support for TLS
+
+ :turbo - optional item indicating sender support for TSEND")
 
 (defun erc-dcc-list-add (type nick peer parent &rest args)
   "Add a new entry of type TYPE to `erc-dcc-list' and return it."
@@ -121,12 +123,13 @@ erc-dcc-list-add
 ;; more: the entry data from erc-dcc-list for this particular process.
 (defvar erc-dcc-connect-function 'erc-dcc-open-network-stream)
 
-(defun erc-dcc-open-network-stream (procname buffer addr port _entry)
+(defun erc-dcc-open-network-stream (procname buffer addr port entry)
   ;; FIXME: Time to try activating this again!?
   (if nil;  (fboundp 'open-network-stream-nowait)  ;; this currently crashes
                                                    ;; cvs emacs
       (open-network-stream-nowait procname buffer addr port)
-    (open-network-stream procname buffer addr port)))
+    (open-network-stream procname buffer addr port
+                         :type (and (plist-get entry :secure) 'tls))))
 
 (erc-define-catalog
  'english
@@ -508,12 +511,11 @@ erc-dcc-do-GET-command
 FILE is the filename.  If FILE is split into multiple arguments,
 re-join the arguments, separated by a space.
 PROC is the server process."
-  (let* ((turbo (prog1 (and (cond ((string= nick "-t")
-                                   (setq nick (pop file)))
-                                  ((member "-t" file)
-                                   (setq file (delete "-t" file))))
-                            t)
-                  (setq file (and file (mapconcat #'identity file " ")))))
+  (let* ((args (seq-group-by (lambda (s) (eq ?- (aref s 0))) (cons nick file)))
+         (flags (prog1 (cdr (assq t args))
+                  (setq args (cdr (assq nil args))
+                        nick (pop args)
+                        file (and args (mapconcat #'identity args " ")))))
          (elt (erc-dcc-member :nick nick :type 'GET :file file))
          (filename (or file (plist-get elt :file) "unknown")))
     (if elt
@@ -535,7 +537,10 @@ erc-dcc-do-GET-command
                     ?n nick ?f filename)))
                 (t
                  (erc-dcc-get-file elt file proc)))
-          (when turbo
+          (when (member "-s" flags)
+            (setq erc-dcc-list (cons (plist-put elt :secure t)
+                                     (delq elt erc-dcc-list))))
+          (when (member "-t" flags)
             (setq erc-dcc-list (cons (plist-put elt :turbo t)
                                      (delq elt erc-dcc-list)))))
       (erc-display-message
@@ -544,11 +549,6 @@ erc-dcc-do-GET-command
 
 (defvar-local erc-dcc-byte-count nil)
 
-;; Experimental flag to indicate TGET-style report omissions
-;; see https://www.visualirc.net/tech-tdcc.php
-;; FIXME actually, we don't need this (drop after adding unit test)
-(defvar erc-dcc--force-turbo nil)
-
 (defun erc-dcc-do-LIST-command (_proc)
   "This is the handler for the /dcc list command.
 It lists the current state of `erc-dcc-list' in an easy to read manner."
@@ -580,6 +580,7 @@ erc-dcc-do-LIST-command
               (process-status (plist-get elt :peer))
             "no")
        ?s (concat size
+                  ;; FIXME consider uniquified names, e.g., foo.bin<2>
                   (if (and (eq 'GET (plist-get elt :type))
                            (plist-member elt :file)
                            (buffer-live-p (get-buffer (plist-get elt :file)))
@@ -592,7 +593,11 @@ erc-dcc-do-LIST-command
                                 (floor (* 100.0 byte-count)
                                        (plist-get elt :size))))))
        ?f (or (and (plist-member elt :file) (plist-get elt :file)) "")
-       ?u (if (or erc-dcc--force-turbo (plist-get elt :turbo)) " (T)" "")))
+       ?u (if-let* ((flags (concat (and (plist-get elt :turbo) "t")
+                                   (and (plist-get elt :secure) "s")))
+                    ((not (string-empty-p flags))))
+              (concat " (" flags ")")
+            "")))
     (erc-display-message
      nil 'notice 'active
      'dcc-list-end)
@@ -619,6 +624,10 @@ erc-ctcp-query-DCC-hook
 
 (defvar erc-dcc-query-handler-alist
   '(("SEND" . erc-dcc-handle-ctcp-send)
+    ("TSEND" . erc-dcc-handle-ctcp-send)
+    ("SSEND" . erc-dcc-handle-ctcp-send)
+    ("TSSEND" . erc-dcc-handle-ctcp-send)
+    ("STSEND" . erc-dcc-handle-ctcp-send)
     ("CHAT" . erc-dcc-handle-ctcp-chat)))
 
 ;;;###autoload
@@ -637,12 +646,16 @@ erc-ctcp-query-DCC
        ?q query ?n nick ?u login ?h host))))
 
 (defconst erc-dcc-ctcp-query-send-regexp
-  (concat "^DCC SEND \\(?:"
+  (rx bot "DCC " (group-n 6 (: (** 0 2 (any "TS")) "SEND")) " "
           ;; Following part matches either filename without spaces
           ;; or filename enclosed in double quotes with any number
           ;; of escaped double quotes inside.
-          "\"\\(\\(?:\\\\\"\\|[^\"\\]\\)+\\)\"\\|\\([^ ]+\\)"
-          "\\) \\([0-9]+\\) \\([0-9]+\\) *\\([0-9]*\\) ?\\(T\\)?"))
+      (: (or (: ?\" (group-n 1 (+ (or (: ?\\ ?\") (not (any ?\" ?\\))))) ?\")
+             (group-n 2 (+ (not " ")))))
+      (: " " (group-n 3 (+ digit))
+         " " (group-n 4 (+ digit))
+         (* " ") (group-n 5 (* digit)))
+      eot))
 
 (define-inline erc-dcc-unquote-filename (filename)
   (inline-quote
@@ -667,13 +680,14 @@ erc-dcc-handle-ctcp-send
        'dcc-request-bogus
        ?r "SEND" ?n nick ?u login ?h host))
      ((string-match erc-dcc-ctcp-query-send-regexp query)
-      (let ((filename
-             (or (match-string 2 query)
-                 (erc-dcc-unquote-filename (match-string 1 query))))
-            (ip       (erc-decimal-to-ip (match-string 3 query)))
-            (port     (match-string 4 query))
-            (size     (match-string 5 query))
-            (turbo    (match-string 6 query)))
+      (let* ((filename (or (match-string 2 query)
+                           (erc-dcc-unquote-filename (match-string 1 query))))
+             (ip (erc-decimal-to-ip (match-string 3 query)))
+             (port (match-string 4 query))
+             (size (match-string 5 query))
+             (sub (substring (match-string 6 query) 0 -4))
+             (secure (seq-contains-p sub ?S #'eq))
+             (turbo (seq-contains-p sub ?T #'eq)))
         ;; FIXME: a warning really should also be sent
         ;; if the ip address != the host the dcc sender is on.
         (erc-display-message
@@ -691,7 +705,8 @@ erc-dcc-handle-ctcp-send
          nil proc
          :ip ip :port port :file filename
          :size (string-to-number size)
-         :turbo (and turbo t))
+         :turbo (and turbo t)
+         :secure (and secure t))
         (if (and (eq erc-dcc-send-request 'auto)
                  (erc-dcc-auto-mask-p (format "\"%s!%s@%s\"" nick login host)))
             (erc-dcc-get-file (car erc-dcc-list) filename proc))))
@@ -970,6 +985,14 @@ erc-dcc-append-contents
       (setq erc-dcc-byte-count (+ (buffer-size) erc-dcc-byte-count))
       (erase-buffer))))
 
+;; If people need this, we can convert it into an option.  The only
+;; known culprit is WeeChat, with its xfer.network.fast_send option
+;; (on by default).  Calling /DCC GET -t works just fine, but WeeChat
+;; sees it as a failure even though the file arrives in its entirety.
+
+(defvar erc-dcc-send-final-turbo-ack nil
+  "Workaround for maverick turbo senders that only require a final ACK.")
+
 (defun erc-dcc-get-filter (proc str)
   "This is the process filter for transfers from other clients to this one.
 It reads incoming bytes from the network and stores them in the DCC
@@ -1004,8 +1027,13 @@ erc-dcc-get-filter
          'dcc-get-file-too-long
          ?f (file-name-nondirectory (buffer-name)))
         (delete-process proc))
-       ((not (or erc-dcc--force-turbo
-                 (plist-get erc-dcc-entry-data :turbo)
+       ;; Some senders want us to hang up.  Only observed w. TSEND.
+       ((and (plist-get erc-dcc-entry-data :turbo)
+             (= received-bytes (plist-get erc-dcc-entry-data :size)))
+        (when erc-dcc-send-final-turbo-ack
+          (process-send-string proc (erc-pack-int received-bytes)))
+        (delete-process proc))
+       ((not (or (plist-get erc-dcc-entry-data :turbo)
                  (process-get proc :reportingp)))
         (process-put proc :reportingp t)
         (process-send-string proc (erc-pack-int received-bytes))
@@ -1016,7 +1044,8 @@ erc-dcc-get-sentinel
 It shuts down the connection and notifies the user that the
 transfer is complete."
   ;; FIXME, we should look at EVENT, and also check size.
-  (unless (string= event "connection broken by remote peer\n")
+  (unless (member event '("connection broken by remote peer\n"
+                          "deleted\n"))
     (lwarn 'erc :warning "Unexpected sentinel event %S for %s"
            (string-trim-right event) proc))
   (with-current-buffer (process-buffer proc)
diff --git a/test/lisp/erc/erc-dcc-tests.el b/test/lisp/erc/erc-dcc-tests.el
index 64ca3363c7..126a1b5287 100644
--- a/test/lisp/erc/erc-dcc-tests.el
+++ b/test/lisp/erc/erc-dcc-tests.el
@@ -26,17 +26,23 @@ erc-dcc-ctcp-query-send-regexp
   (let ((s "DCC SEND \"file name\" 2130706433 9899 1405135128"))
     (should (string-match erc-dcc-ctcp-query-send-regexp s))
     (should-not (match-string 2 s))
-    (should (string= "file name" (match-string 1 s))))
+    (should (string= "file name" (match-string 1 s)))
+    (should (string= "SEND" (match-string 6 s))))
+  (let ((s "DCC SEND \"file \\\" name\" 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should-not (match-string 2 s))
+    (should (string= "SEND" (match-string 6 s)))
+    (should (string= "file \" name"
+                     (erc-dcc-unquote-filename (match-string 1 s)))))
   (let ((s "DCC SEND filename 2130706433 9899 1405135128"))
     (should (string-match erc-dcc-ctcp-query-send-regexp s))
     (should (string= "filename" (match-string 2 s)))
     (should (string= "2130706433" (match-string 3 s)))
     (should (string= "9899" (match-string 4 s)))
-    (should (string= "1405135128" (match-string 5 s)))
-    (should-not (match-string 6 s)))
-  (let ((s "DCC SEND filename 2130706433 9899 1405135128 T"))
+    (should (string= "1405135128" (match-string 5 s))))
+  (let ((s "DCC TSEND filename 2130706433 9899 1405135128"))
     (should (string-match erc-dcc-ctcp-query-send-regexp s))
-    (should (string= "T" (match-string 6 s)))))
+    (should (string= "TSEND" (match-string 6 s)))))
 
 ;; This also indirectly tests base functionality for
 ;; `erc-dcc-do-LIST-command'
@@ -56,8 +62,8 @@ erc-dcc-tests--dcc-handle-ctcp-send
                         "~tester"
                         "fake.irc"
                         "dummy"
-                        (concat "DCC SEND foo 2130706433 9899 1405135128"
-                                (and turbo " T")))
+                        (concat "DCC " (if turbo "TSEND" "SEND")
+                                " foo 2130706433 9899 1405135128"))
     (should-not (cdr erc-dcc-list))
     (should (equal (plist-put (car erc-dcc-list) :parent 'fake)
                    `(:nick "tester!~tester@fake.irc"
@@ -68,7 +74,8 @@ erc-dcc-tests--dcc-handle-ctcp-send
                            :port "9899"
                            :file "foo"
                            :size 1405135128
-                           :turbo ,turbo)))
+                           :turbo ,(and turbo t)
+                           :secure nil)))
     (goto-char (point-min))
     (should (search-forward "file foo offered by tester" nil t))
     (erc-dcc-do-LIST-command erc-server-process)
-- 
2.35.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0001-Display-error-message-on-incomplete-ERC-DCC-transfer.patch --]
[-- Type: text/x-patch, Size: 3870 bytes --]

From 494f37ca515cfa0c09d5d0a698d0899e5d9e759e Mon Sep 17 00:00:00 2001
From: "F. Jason Park" <jp@neverwas.me>
Date: Wed, 30 Mar 2022 17:16:11 -0700
Subject: [PATCH 1/5] Display error message on incomplete ERC DCC transfer

* lisp/erc/erc-dcc.el (erc-dcc-get-sentinel): Display error when total
byte count received is lower than expected.
(erc-message-english-dcc-get-failed): Add `dcc-get-incomplete' to
the English catalog.
(erc-dcc-get-file): Tweak initialization of `erc-dcc-entry-data'.
(Bug#54458)
---
 lisp/erc/erc-dcc.el | 35 +++++++++++++++++++----------------
 1 file changed, 19 insertions(+), 16 deletions(-)

diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index 59bfd24603..a37dc7caa3 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -144,6 +144,7 @@ erc-dcc-open-network-stream
    (dcc-get-bytes-received . "DCC: %f: %b bytes received")
    (dcc-get-complete
     . "DCC: file %f transfer complete (%s bytes in %t seconds)")
+   (dcc-get-failed . "DCC: file %f transfer failed at %s of %v in %t seconds")
    (dcc-get-cmd-aborted . "DCC: Aborted getting %f from %n")
    (dcc-get-file-too-long
     . "DCC: %f: File longer than sender claimed; aborting transfer")
@@ -920,8 +921,7 @@ erc-dcc-get-file
             (inhibit-file-name-operation 'write-region))
         (write-region (point) (point) erc-dcc-file-name nil 'nomessage))
 
-      (setq erc-server-process parent-proc
-            erc-dcc-entry-data entry)
+      (setq erc-server-process parent-proc)
       (setq erc-dcc-byte-count 0)
       (setq proc
             (funcall erc-dcc-connect-function
@@ -935,8 +935,8 @@ erc-dcc-get-file
 
       (set-process-filter proc #'erc-dcc-get-filter)
       (set-process-sentinel proc #'erc-dcc-get-sentinel)
-      (setq entry (plist-put entry :start-time (erc-current-time)))
-      (setq entry (plist-put entry :peer proc)))))
+      (setq erc-dcc-entry-data (plist-put (plist-put entry :peer proc)
+                                          :start-time (erc-current-time))))))
 
 (defun erc-dcc-append-contents (buffer _file)
   "Append the contents of BUFFER to FILE.
@@ -990,27 +990,30 @@ erc-dcc-get-filter
         (process-send-string
          proc (erc-pack-int received-bytes)))))))
 
-
-(defun erc-dcc-get-sentinel (proc _event)
+(defun erc-dcc-get-sentinel (proc event)
   "This is the process sentinel for CTCP DCC SEND connections.
 It shuts down the connection and notifies the user that the
 transfer is complete."
   ;; FIXME, we should look at EVENT, and also check size.
+  (unless (string= event "connection broken by remote peer\n")
+    (lwarn 'erc :warning "Unexpected sentinel event %S for %s"
+           (string-trim-right event) proc))
   (with-current-buffer (process-buffer proc)
     (delete-process proc)
     (setq erc-dcc-list (delete erc-dcc-entry-data erc-dcc-list))
     (unless (= (point-min) (point-max))
       (erc-dcc-append-contents (current-buffer) erc-dcc-file-name))
-    (erc-display-message
-     nil 'notice erc-server-process
-     'dcc-get-complete
-     ?f erc-dcc-file-name
-     ?s (number-to-string erc-dcc-byte-count)
-     ?t (format "%.0f"
-                (erc-time-diff (plist-get erc-dcc-entry-data :start-time)
-                               nil))))
-  (kill-buffer (process-buffer proc))
-  (delete-process proc))
+    (let ((done (= erc-dcc-byte-count (plist-get erc-dcc-entry-data :size))))
+      (erc-display-message
+       nil (if done 'notice '(notice error)) erc-server-process
+       (if done 'dcc-get-complete 'dcc-get-failed)
+       ?v (plist-get erc-dcc-entry-data :size)
+       ?f erc-dcc-file-name
+       ?s (number-to-string erc-dcc-byte-count)
+       ?t (format "%.0f"
+                  (erc-time-diff (plist-get erc-dcc-entry-data :start-time)
+                                 nil))))
+    (kill-buffer)))
 
 ;;; CHAT handling
 
-- 
2.35.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0002-Don-t-send-reports-in-erc-dcc-get-filter-when-nested.patch --]
[-- Type: text/x-patch, Size: 1161 bytes --]

From af28665f92db12e59d2e3a6faeede6b3c2a96dce Mon Sep 17 00:00:00 2001
From: "F. Jason Park" <jp@neverwas.me>
Date: Mon, 28 Mar 2022 02:24:43 -0700
Subject: [PATCH 2/5] Don't send reports in erc-dcc-get-filter when nested

* lisp/erc/erc-dcc.el (erc-dcc-get-filter): Don't bother sending a
"received so far" receipt if another attempt is ongoing
(Bug#54458)
---
 lisp/erc/erc-dcc.el | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index a37dc7caa3..2a06efdaa4 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -986,9 +986,10 @@ erc-dcc-get-filter
          'dcc-get-file-too-long
          ?f (file-name-nondirectory (buffer-name)))
         (delete-process proc))
-       (t
-        (process-send-string
-         proc (erc-pack-int received-bytes)))))))
+       ((not (process-get proc :reportingp))
+        (process-put proc :reportingp t)
+        (process-send-string proc (erc-pack-int received-bytes))
+        (process-put proc :reportingp nil))))))
 
 (defun erc-dcc-get-sentinel (proc event)
   "This is the process sentinel for CTCP DCC SEND connections.
-- 
2.35.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: 0003-Allow-matching-against-string-values-in-erc-dcc-memb.patch --]
[-- Type: text/x-patch, Size: 1395 bytes --]

From 9c1ea280ec6bd016a9d4e3b0515835c283a038ad Mon Sep 17 00:00:00 2001
From: "F. Jason Park" <jp@neverwas.me>
Date: Sat, 9 Apr 2022 23:32:22 -0700
Subject: [PATCH 3/5] Allow matching against string values in erc-dcc-member

* lisp/erc/erc-dcc.el (erc-dcc-member): Be more tolerant in the
catch-all case by testing for equality instead of identity.
(erc-dcc-do-GET-command): Pass filename when querying
`erc-dcc-member'. (Bug#54458)
---
 lisp/erc/erc-dcc.el | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index 2a06efdaa4..babd0f3046 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -196,7 +196,7 @@ erc-dcc-member
                       (erc-extract-nick test)
                       (erc-extract-nick val)))
                 ;; not a nick
-                (eq test val)
+                (equal test val)
                 (setq cont nil))))
         (if cont
             (setq result elt)
@@ -507,7 +507,7 @@ erc-dcc-do-GET-command
 re-join the arguments, separated by a space.
 PROC is the server process."
   (setq file (and file (mapconcat #'identity file " ")))
-  (let* ((elt (erc-dcc-member :nick nick :type 'GET))
+  (let* ((elt (erc-dcc-member :nick nick :type 'GET :file file))
          (filename (or file (plist-get elt :file) "unknown")))
     (if elt
         (let* ((file (read-file-name
-- 
2.35.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #6: 0004-Accept-turbo-param-in-erc-dcc-do-GET-command.patch --]
[-- Type: text/x-patch, Size: 16913 bytes --]

From 36356e9ddbc4a304442bbd16fec0e41d261552cb Mon Sep 17 00:00:00 2001
From: "F. Jason Park" <jp@neverwas.me>
Date: Sat, 30 Apr 2022 02:16:46 -0700
Subject: [PATCH 4/5] Accept turbo param in erc-dcc-do-GET-command

* lisp/erc/erc-dcc.el (erc-dcc-list): Document optional :turbo item.
(erc-message-english-dcc-list-{head,line,item}): Adjust format strings
to make room for "(T)" turbo indicator.
(erc-dcc-do-GET-command): Optionally set :turbo in `erc-dcc-list'
entry when passed -t argument in the /DCC GET slash-command.
(erc-dcc--force-turbo): Add temporary internal var.
(erc-dcc-do-LIST): Print message with new format specifier for turbo
status.
(erc-dcc-ctcp-query-send-regexp): Account for nonstandard terminating
T.
(erc-dcc-handle-ctcp-send): set :turbo item in `erc-dcc-list' member
when new match-group nonempty.
(erc-dcc-send-final-turbo-ack): New internal variable and possible
future option for extreme corner-cases involving maverick quasi-turbo
senders.
(erc-dcc-get-filter): Don't send when turbo active.

* test/lisp/erc/erc-dcc-tests.el: Add new file.
(Bug#54458)
---
 lisp/erc/erc-dcc.el            |  79 +++++++++++-----
 test/lisp/erc/erc-dcc-tests.el | 163 +++++++++++++++++++++++++++++++++
 2 files changed, 221 insertions(+), 21 deletions(-)
 create mode 100644 test/lisp/erc/erc-dcc-tests.el

diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index babd0f3046..591930c74e 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -43,7 +43,7 @@
 ;;  /dcc chat nick - Either accept pending chat offer from nick, or offer
 ;;                   DCC chat to nick
 ;;  /dcc close type [nick] - Close DCC connection (SEND/GET/CHAT) with nick
-;;  /dcc get nick [file] - Accept DCC offer from nick
+;;  /dcc get [-t] nick [file] - Accept DCC offer from nick
 ;;  /dcc list - List all DCC offers/connections
 ;;  /dcc send nick file - Offer DCC SEND to nick
 
@@ -105,7 +105,9 @@ erc-dcc-list
  :file - for outgoing sends, the full path to the file.  For incoming sends,
          the suggested filename or vetted filename
 
- :size - size of the file, may be nil on incoming DCCs")
+ :size - size of the file, may be nil on incoming DCCs
+
+ :turbo - optional item indicating sender support for TSEND")
 
 (defun erc-dcc-list-add (type nick peer parent &rest args)
   "Add a new entry of type TYPE to `erc-dcc-list' and return it."
@@ -149,9 +151,9 @@ erc-dcc-open-network-stream
    (dcc-get-file-too-long
     . "DCC: %f: File longer than sender claimed; aborting transfer")
    (dcc-get-notfound . "DCC: %n hasn't offered %f for DCC transfer")
-   (dcc-list-head . "DCC: From      Type  Active  Size            Filename")
-   (dcc-list-line . "DCC: --------  ----  ------  --------------  --------")
-   (dcc-list-item . "DCC: %-8n  %-4t  %-6a  %-14s  %f")
+   (dcc-list-head . "DCC: From      Type  Active  Size               Filename")
+   (dcc-list-line . "DCC: --------  ----  ------  -----------------  --------")
+   (dcc-list-item . "DCC: %-8n  %-4t  %-6a  %-17s  %f%u")
    (dcc-list-end  . "DCC: End of list.")
    (dcc-malformed . "DCC: error: %n (%u@%h) sent malformed request: %q")
    (dcc-privileged-port
@@ -506,8 +508,12 @@ erc-dcc-do-GET-command
 FILE is the filename.  If FILE is split into multiple arguments,
 re-join the arguments, separated by a space.
 PROC is the server process."
-  (setq file (and file (mapconcat #'identity file " ")))
-  (let* ((elt (erc-dcc-member :nick nick :type 'GET :file file))
+  (let* ((args (seq-group-by (lambda (s) (eq ?- (aref s 0))) (cons nick file)))
+         (flags (prog1 (cdr (assq t args))
+                  (setq args (cdr (assq nil args))
+                        nick (pop args)
+                        file (and args (mapconcat #'identity args " ")))))
+         (elt (erc-dcc-member :nick nick :type 'GET :file file))
          (filename (or file (plist-get elt :file) "unknown")))
     (if elt
         (let* ((file (read-file-name
@@ -527,7 +533,10 @@ erc-dcc-do-GET-command
                     'dcc-get-cmd-aborted
                     ?n nick ?f filename)))
                 (t
-                 (erc-dcc-get-file elt file proc))))
+                 (erc-dcc-get-file elt file proc)))
+          (when (member "-t" flags)
+            (setq erc-dcc-list (cons (plist-put elt :turbo t)
+                                     (delq elt erc-dcc-list)))))
       (erc-display-message
        nil '(notice error) 'active
        'dcc-get-notfound ?n nick ?f filename))))
@@ -576,7 +585,12 @@ erc-dcc-do-LIST-command
                         (format " (%d%%)"
                                 (floor (* 100.0 byte-count)
                                        (plist-get elt :size))))))
-       ?f (or (and (plist-member elt :file) (plist-get elt :file)) "")))
+       ?f (or (and (plist-member elt :file) (plist-get elt :file)) "")
+       ?u (if-let* ((flags (concat (and (plist-get elt :turbo) "t")
+                                   (and (plist-get elt :placeholder) "p")))
+                    ((not (string-empty-p flags))))
+              (concat " (" flags ")")
+            "")))
     (erc-display-message
      nil 'notice 'active
      'dcc-list-end)
@@ -603,6 +617,7 @@ erc-ctcp-query-DCC-hook
 
 (defvar erc-dcc-query-handler-alist
   '(("SEND" . erc-dcc-handle-ctcp-send)
+    ("TSEND" . erc-dcc-handle-ctcp-send)
     ("CHAT" . erc-dcc-handle-ctcp-chat)))
 
 ;;;###autoload
@@ -621,12 +636,16 @@ erc-ctcp-query-DCC
        ?q query ?n nick ?u login ?h host))))
 
 (defconst erc-dcc-ctcp-query-send-regexp
-  (concat "^DCC SEND \\(?:"
+  (rx bot "DCC " (group-n 6 (: (** 0 2 (any "TS")) "SEND")) " "
           ;; Following part matches either filename without spaces
           ;; or filename enclosed in double quotes with any number
           ;; of escaped double quotes inside.
-          "\"\\(\\(?:\\\\\"\\|[^\"\\]\\)+\\)\"\\|\\([^ ]+\\)"
-          "\\) \\([0-9]+\\) \\([0-9]+\\) *\\([0-9]*\\)"))
+      (: (or (: ?\" (group-n 1 (+ (or (: ?\\ ?\") (not (any ?\" ?\\))))) ?\")
+             (group-n 2 (+ (not " ")))))
+      (: " " (group-n 3 (+ digit))
+         " " (group-n 4 (+ digit))
+         (* " ") (group-n 5 (* digit)))
+      eot))
 
 (define-inline erc-dcc-unquote-filename (filename)
   (inline-quote
@@ -651,12 +670,13 @@ erc-dcc-handle-ctcp-send
        'dcc-request-bogus
        ?r "SEND" ?n nick ?u login ?h host))
      ((string-match erc-dcc-ctcp-query-send-regexp query)
-      (let ((filename
-             (or (match-string 2 query)
-                 (erc-dcc-unquote-filename (match-string 1 query))))
-            (ip       (erc-decimal-to-ip (match-string 3 query)))
-            (port     (match-string 4 query))
-            (size     (match-string 5 query)))
+      (let* ((filename (or (match-string 2 query)
+                           (erc-dcc-unquote-filename (match-string 1 query))))
+             (ip (erc-decimal-to-ip (match-string 3 query)))
+             (port (match-string 4 query))
+             (size (match-string 5 query))
+             (sub (substring (match-string 6 query) 0 -4))
+             (turbo (seq-contains-p sub ?T #'eq)))
         ;; FIXME: a warning really should also be sent
         ;; if the ip address != the host the dcc sender is on.
         (erc-display-message
@@ -673,7 +693,8 @@ erc-dcc-handle-ctcp-send
          'GET (format "%s!%s@%s" nick login host)
          nil proc
          :ip ip :port port :file filename
-         :size (string-to-number size))
+         :size (string-to-number size)
+         :turbo (and turbo t))
         (if (and (eq erc-dcc-send-request 'auto)
                  (erc-dcc-auto-mask-p (format "\"%s!%s@%s\"" nick login host)))
             (erc-dcc-get-file (car erc-dcc-list) filename proc))))
@@ -952,6 +973,14 @@ erc-dcc-append-contents
       (setq erc-dcc-byte-count (+ (buffer-size) erc-dcc-byte-count))
       (erase-buffer))))
 
+;; If people need this, we can convert it into an option.  The only
+;; known culprit is WeeChat, with its xfer.network.fast_send option
+;; (on by default).  Calling /DCC GET -t works just fine, but WeeChat
+;; sees it as a failure even though the file arrives in its entirety.
+
+(defvar erc-dcc-send-final-turbo-ack nil
+  "Workaround for maverick turbo senders that only require a final ACK.")
+
 (defun erc-dcc-get-filter (proc str)
   "This is the process filter for transfers from other clients to this one.
 It reads incoming bytes from the network and stores them in the DCC
@@ -986,7 +1015,14 @@ erc-dcc-get-filter
          'dcc-get-file-too-long
          ?f (file-name-nondirectory (buffer-name)))
         (delete-process proc))
-       ((not (process-get proc :reportingp))
+       ;; Some senders want us to hang up.  Only observed w. TSEND.
+       ((and (plist-get erc-dcc-entry-data :turbo)
+             (= received-bytes (plist-get erc-dcc-entry-data :size)))
+        (when erc-dcc-send-final-turbo-ack
+          (process-send-string proc (erc-pack-int received-bytes)))
+        (delete-process proc))
+       ((not (or (plist-get erc-dcc-entry-data :turbo)
+                 (process-get proc :reportingp)))
         (process-put proc :reportingp t)
         (process-send-string proc (erc-pack-int received-bytes))
         (process-put proc :reportingp nil))))))
@@ -996,7 +1032,8 @@ erc-dcc-get-sentinel
 It shuts down the connection and notifies the user that the
 transfer is complete."
   ;; FIXME, we should look at EVENT, and also check size.
-  (unless (string= event "connection broken by remote peer\n")
+  (unless (member event '("connection broken by remote peer\n"
+                          "deleted\n"))
     (lwarn 'erc :warning "Unexpected sentinel event %S for %s"
            (string-trim-right event) proc))
   (with-current-buffer (process-buffer proc)
diff --git a/test/lisp/erc/erc-dcc-tests.el b/test/lisp/erc/erc-dcc-tests.el
new file mode 100644
index 0000000000..2f66d89072
--- /dev/null
+++ b/test/lisp/erc/erc-dcc-tests.el
@@ -0,0 +1,163 @@
+;;; erc-dcc-tests.el --- Tests for erc-dcc  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2020-2022 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 <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Code:
+(require 'ert)
+(require 'erc-dcc)
+
+(ert-deftest erc-dcc-ctcp-query-send-regexp ()
+  (let ((s "DCC SEND \"file name\" 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should-not (match-string 2 s))
+    (should (string= "file name" (match-string 1 s)))
+    (should (string= "SEND" (match-string 6 s))))
+  (let ((s "DCC SEND \"file \\\" name\" 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should-not (match-string 2 s))
+    (should (string= "SEND" (match-string 6 s)))
+    (should (string= "file \" name"
+                     (erc-dcc-unquote-filename (match-string 1 s)))))
+  (let ((s "DCC SEND filename 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should (string= "filename" (match-string 2 s)))
+    (should (string= "2130706433" (match-string 3 s)))
+    (should (string= "9899" (match-string 4 s)))
+    (should (string= "1405135128" (match-string 5 s))))
+  (let ((s "DCC TSEND filename 2130706433 9899 1405135128"))
+    (should (string-match erc-dcc-ctcp-query-send-regexp s))
+    (should (string= "TSEND" (match-string 6 s)))))
+
+;; This also indirectly tests base functionality for
+;; `erc-dcc-do-LIST-command'
+
+(defun erc-dcc-tests--dcc-handle-ctcp-send (turbo)
+  (with-current-buffer (get-buffer-create "fake-server")
+    (erc-mode)
+    (setq erc-server-process
+          (start-process "fake" (current-buffer) "sleep" "1")
+          erc-input-marker (make-marker)
+          erc-insert-marker (make-marker)
+          erc-server-current-nick "dummy")
+    (set-process-query-on-exit-flag erc-server-process nil)
+    (should-not erc-dcc-list)
+    (erc-ctcp-query-DCC erc-server-process
+                        "tester"
+                        "~tester"
+                        "fake.irc"
+                        "dummy"
+                        (concat "DCC " (if turbo "TSEND" "SEND")
+                                " foo 2130706433 9899 1405135128"))
+    (should-not (cdr erc-dcc-list))
+    (should (equal (plist-put (car erc-dcc-list) :parent 'fake)
+                   `(:nick "tester!~tester@fake.irc"
+                           :type GET
+                           :peer nil
+                           :parent fake
+                           :ip "127.0.0.1"
+                           :port "9899"
+                           :file "foo"
+                           :size 1405135128
+                           :turbo ,(and turbo t))))
+    (goto-char (point-min))
+    (should (search-forward "file foo offered by tester" nil t))
+    (erc-dcc-do-LIST-command erc-server-process)
+    (should (search-forward-regexp (concat
+                                    "GET +no +1405135128 +foo"
+                                    (and turbo " +(T)") "$")
+                                   nil t))
+    (when noninteractive
+      (let (erc-kill-channel-hook erc-kill-server-hook erc-kill-buffer-hook)
+        (kill-buffer))))
+  ;; `erc-dcc-list' is global; must leave it empty
+  (should erc-dcc-list)
+  (setq erc-dcc-list nil))
+
+(ert-deftest erc-dcc-handle-ctcp-send--base ()
+  (erc-dcc-tests--dcc-handle-ctcp-send nil))
+
+(ert-deftest erc-dcc-handle-ctcp-send--turbo ()
+  (erc-dcc-tests--dcc-handle-ctcp-send t))
+
+(ert-deftest erc-dcc-do-GET-command ()
+  (with-temp-buffer
+    (let* ((proc (start-process "fake" (current-buffer) "sleep" "1"))
+           erc-accidental-paste-threshold-seconds
+           erc-send-completed-hook
+           erc-kill-channel-hook erc-kill-server-hook erc-kill-buffer-hook
+           (elt `(:nick "tester!~tester@fake.irc"
+                        :type GET
+                        :peer nil
+                        :parent ,proc
+                        :ip "127.0.0.1"
+                        :port "9899"
+                        :file "foo.bin"
+                        :size 1405135128))
+           (erc-dcc-list (list elt))
+           ;;
+           calls)
+      (erc-mode)
+      (setq erc-server-process proc
+            erc-input-marker (make-marker)
+            erc-insert-marker (make-marker)
+            erc-server-current-nick "dummy")
+      (set-process-query-on-exit-flag proc nil)
+      (cl-letf (((symbol-function 'read-file-name)
+                 (lambda (&rest _) "foo.bin"))
+                ((symbol-function 'erc-dcc-get-file)
+                 (lambda (&rest r) (push r calls))))
+        (goto-char (point-max))
+        (set-marker erc-insert-marker (point-max))
+        (erc-display-prompt)
+
+        (ert-info ("No turbo")
+          (should-not (plist-member elt :turbo))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET tester foo.bin")
+          (erc-send-current-line)
+          (should-not (plist-member (car erc-dcc-list) :turbo))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))
+
+        (ert-info ("Arg turbo in pos 2")
+          (should-not (plist-member elt :turbo))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET -t tester foo.bin")
+          (erc-send-current-line)
+          (should (eq t (plist-get (car erc-dcc-list) :turbo)))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))
+
+        (ert-info ("Arg turbo in pos 4")
+          (setq elt (plist-put elt :turbo nil)
+                erc-dcc-list (list elt))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET tester -t foo.bin")
+          (erc-send-current-line)
+          (should (eq t (plist-get (car erc-dcc-list) :turbo)))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))
+
+        (ert-info ("Arg turbo in pos 6")
+          (setq elt (plist-put elt :turbo nil)
+                erc-dcc-list (list elt))
+          (goto-char erc-input-marker)
+          (insert "/dcc GET tester foo.bin -t")
+          (erc-send-current-line)
+          (should (eq t (plist-get (car erc-dcc-list) :turbo)))
+          (should (equal (pop calls) (list elt "foo.bin" proc))))))))
+
+;;; erc-dcc-tests.el ends here
-- 
2.35.1


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #7: 0005-Support-receiving-from-DCC-SSEND-in-erc-dcc.patch --]
[-- Type: text/x-patch, Size: 5758 bytes --]

From 32b268f03891c297b14bbaee45833d33fe051c17 Mon Sep 17 00:00:00 2001
From: "F. Jason Park" <jp@neverwas.me>
Date: Thu, 5 May 2022 21:13:47 -0700
Subject: [PATCH 5/5] Support receiving from DCC SSEND in erc-dcc

* lips/erc/erc-dcc.el (erc-dcc-open-network-stream): Use TLS
for new connections when :secure flag is set.
(erc-dcc-do-GET-command): Set secure flag when user explicitly passes
an "-s" option.
(erc-dcc-do-LIST-command): Show an "s" to indicate a secure connection
when applicable.
(erc-dcc-query-handler-alist): Add extra items for "SSEND", etc.
(erc-dcc-handle-ctcp-send): Set secure flag when based on the
presenceof a leading "S" in the command type.
---
 lisp/erc/erc-dcc.el            | 22 +++++++++++++++++-----
 test/lisp/erc/erc-dcc-tests.el |  3 ++-
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/lisp/erc/erc-dcc.el b/lisp/erc/erc-dcc.el
index 591930c74e..aa48be4dde 100644
--- a/lisp/erc/erc-dcc.el
+++ b/lisp/erc/erc-dcc.el
@@ -43,7 +43,7 @@
 ;;  /dcc chat nick - Either accept pending chat offer from nick, or offer
 ;;                   DCC chat to nick
 ;;  /dcc close type [nick] - Close DCC connection (SEND/GET/CHAT) with nick
-;;  /dcc get [-t] nick [file] - Accept DCC offer from nick
+;;  /dcc get [-t][-s] nick [file] - Accept DCC offer from nick
 ;;  /dcc list - List all DCC offers/connections
 ;;  /dcc send nick file - Offer DCC SEND to nick
 
@@ -107,6 +107,8 @@ erc-dcc-list
 
  :size - size of the file, may be nil on incoming DCCs
 
+ :secure - optional item indicating sender support for TLS
+
  :turbo - optional item indicating sender support for TSEND")
 
 (defun erc-dcc-list-add (type nick peer parent &rest args)
@@ -121,12 +123,13 @@ erc-dcc-list-add
 ;; more: the entry data from erc-dcc-list for this particular process.
 (defvar erc-dcc-connect-function 'erc-dcc-open-network-stream)
 
-(defun erc-dcc-open-network-stream (procname buffer addr port _entry)
+(defun erc-dcc-open-network-stream (procname buffer addr port entry)
   ;; FIXME: Time to try activating this again!?
   (if nil;  (fboundp 'open-network-stream-nowait)  ;; this currently crashes
                                                    ;; cvs emacs
       (open-network-stream-nowait procname buffer addr port)
-    (open-network-stream procname buffer addr port)))
+    (open-network-stream procname buffer addr port
+                         :type (and (plist-get entry :secure) 'tls))))
 
 (erc-define-catalog
  'english
@@ -534,6 +537,9 @@ erc-dcc-do-GET-command
                     ?n nick ?f filename)))
                 (t
                  (erc-dcc-get-file elt file proc)))
+          (when (member "-s" flags)
+            (setq erc-dcc-list (cons (plist-put elt :secure t)
+                                     (delq elt erc-dcc-list))))
           (when (member "-t" flags)
             (setq erc-dcc-list (cons (plist-put elt :turbo t)
                                      (delq elt erc-dcc-list)))))
@@ -574,6 +580,7 @@ erc-dcc-do-LIST-command
               (process-status (plist-get elt :peer))
             "no")
        ?s (concat size
+                  ;; FIXME consider uniquified names, e.g., foo.bin<2>
                   (if (and (eq 'GET (plist-get elt :type))
                            (plist-member elt :file)
                            (buffer-live-p (get-buffer (plist-get elt :file)))
@@ -587,7 +594,7 @@ erc-dcc-do-LIST-command
                                        (plist-get elt :size))))))
        ?f (or (and (plist-member elt :file) (plist-get elt :file)) "")
        ?u (if-let* ((flags (concat (and (plist-get elt :turbo) "t")
-                                   (and (plist-get elt :placeholder) "p")))
+                                   (and (plist-get elt :secure) "s")))
                     ((not (string-empty-p flags))))
               (concat " (" flags ")")
             "")))
@@ -618,6 +625,9 @@ erc-ctcp-query-DCC-hook
 (defvar erc-dcc-query-handler-alist
   '(("SEND" . erc-dcc-handle-ctcp-send)
     ("TSEND" . erc-dcc-handle-ctcp-send)
+    ("SSEND" . erc-dcc-handle-ctcp-send)
+    ("TSSEND" . erc-dcc-handle-ctcp-send)
+    ("STSEND" . erc-dcc-handle-ctcp-send)
     ("CHAT" . erc-dcc-handle-ctcp-chat)))
 
 ;;;###autoload
@@ -676,6 +686,7 @@ erc-dcc-handle-ctcp-send
              (port (match-string 4 query))
              (size (match-string 5 query))
              (sub (substring (match-string 6 query) 0 -4))
+             (secure (seq-contains-p sub ?S #'eq))
              (turbo (seq-contains-p sub ?T #'eq)))
         ;; FIXME: a warning really should also be sent
         ;; if the ip address != the host the dcc sender is on.
@@ -694,7 +705,8 @@ erc-dcc-handle-ctcp-send
          nil proc
          :ip ip :port port :file filename
          :size (string-to-number size)
-         :turbo (and turbo t))
+         :turbo (and turbo t)
+         :secure (and secure t))
         (if (and (eq erc-dcc-send-request 'auto)
                  (erc-dcc-auto-mask-p (format "\"%s!%s@%s\"" nick login host)))
             (erc-dcc-get-file (car erc-dcc-list) filename proc))))
diff --git a/test/lisp/erc/erc-dcc-tests.el b/test/lisp/erc/erc-dcc-tests.el
index 2f66d89072..126a1b5287 100644
--- a/test/lisp/erc/erc-dcc-tests.el
+++ b/test/lisp/erc/erc-dcc-tests.el
@@ -74,7 +74,8 @@ erc-dcc-tests--dcc-handle-ctcp-send
                            :port "9899"
                            :file "foo"
                            :size 1405135128
-                           :turbo ,(and turbo t))))
+                           :turbo ,(and turbo t)
+                           :secure nil)))
     (goto-char (point-min))
     (should (search-forward "file foo offered by tester" nil t))
     (erc-dcc-do-LIST-command erc-server-process)
-- 
2.35.1


  parent reply	other threads:[~2022-05-06 13:06 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-18 22:59 bug#54458: 27.2; erc-dcc-get: Re-entering top level after C stack overflow Fernando de Morais
2022-03-21 14:09 ` J.P.
2022-03-22 13:50   ` Fernando de Morais
2022-03-22 14:36     ` Eli Zaretskii
     [not found]       ` <87tubj1eq4.fsf@gmail.com>
2022-03-27 17:56         ` Eli Zaretskii
2022-03-27 22:09           ` Fernando de Morais
2022-03-27 20:54 ` Mattias Engdegård
2022-03-28  9:23   ` Mattias Engdegård
2022-03-28 11:14     ` Eli Zaretskii
2022-03-28 12:08       ` J.P.
2022-03-29 15:49         ` Mattias Engdegård
2022-03-29 16:45           ` Eli Zaretskii
2022-03-29 17:47             ` Mattias Engdegård
2022-03-29 19:44               ` J.P.
2022-03-30  4:02                 ` J.P.
     [not found]                 ` <87mth8rst7.fsf@neverwas.me>
2022-03-30 15:28                   ` Mattias Engdegård
2022-03-31 19:18                     ` J.P.
     [not found]                     ` <87sfqygccz.fsf@neverwas.me>
2022-04-03 17:20                       ` Fernando de Morais
2022-04-03 19:46                         ` J.P.
     [not found]                         ` <87wng67xxd.fsf@neverwas.me>
2022-04-10 21:31                           ` J.P.
     [not found]                           ` <875yng39sa.fsf@neverwas.me>
2022-04-11  3:17                             ` J.P.
     [not found]                             ` <87sfqkz4ts.fsf@neverwas.me>
2022-04-25  0:59                               ` Fernando de Morais
     [not found]                               ` <87ilqyrn9s.fsf@gmail.com>
2022-04-25 12:08                                 ` J.P.
     [not found]                                 ` <878rrtz7or.fsf@neverwas.me>
2022-04-29 14:51                                   ` Fernando de Morais
     [not found]                                   ` <87r15guen2.fsf@gmail.com>
2022-04-30 13:39                                     ` J.P.
     [not found]                                     ` <87ilqqy9km.fsf@neverwas.me>
2022-05-04 13:03                                       ` Fernando de Morais
     [not found]                                       ` <87pmkth2lr.fsf@gmail.com>
2022-05-06 13:06                                         ` J.P. [this message]
     [not found]                                         ` <874k22zu7s.fsf@neverwas.me>
2022-05-08  1:16                                           ` Fernando de Morais
     [not found]                                           ` <87sfpk4ydj.fsf@gmail.com>
2022-05-11 14:29                                             ` J.P.
     [not found]                                             ` <87ee10xhw3.fsf@neverwas.me>
2022-05-23  1:22                                               ` J.P.
2022-04-01  6:32                   ` J.P.

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='874k22zu7s.fsf__15427.6849397988$1651842659$gmane$org@neverwas.me' \
    --to=jp@neverwas.me \
    --cc=54458@debbugs.gnu.org \
    --cc=bandali@gnu.org \
    --cc=eliz@gnu.org \
    --cc=emacs-erc@gnu.org \
    --cc=fernandodemorais.jf@gmail.com \
    --cc=mattiase@acm.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).