From debbugs-submit-bounces@debbugs.gnu.org Sat Jan 06 06:39:56 2018 Received: (at submit) by debbugs.gnu.org; 6 Jan 2018 11:39:56 +0000 Received: from localhost ([127.0.0.1]:37587 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eXmpQ-00050k-61 for submit@debbugs.gnu.org; Sat, 06 Jan 2018 06:39:56 -0500 Received: from eggs.gnu.org ([208.118.235.92]:59848) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eXmpO-00050Z-TW for submit@debbugs.gnu.org; Sat, 06 Jan 2018 06:39:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eXmpI-0000MF-PC for submit@debbugs.gnu.org; Sat, 06 Jan 2018 06:39:49 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_50, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,T_DKIM_INVALID autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:43144) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eXmpI-0000M6-LL for submit@debbugs.gnu.org; Sat, 06 Jan 2018 06:39:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eXmpH-0005Ug-Ce for bug-gnu-emacs@gnu.org; Sat, 06 Jan 2018 06:39:48 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eXmpG-0000KE-H3 for bug-gnu-emacs@gnu.org; Sat, 06 Jan 2018 06:39:47 -0500 Received: from mail-wm0-x22a.google.com ([2a00:1450:400c:c09::22a]:34930) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eXmpG-0000JX-BF for bug-gnu-emacs@gnu.org; Sat, 06 Jan 2018 06:39:46 -0500 Received: by mail-wm0-x22a.google.com with SMTP id a79so6622729wma.0 for ; Sat, 06 Jan 2018 03:39:46 -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; bh=/XdGyzbxr+o22I/N5y4AB4fPx1K1PyOhlj9PNKFVT7I=; b=cnqw8kvjpp1xvx72ImqeRQ9nPiThHclo04iq9hceHQQ3aDwBLGAf7f28zL3qo9I0hy aj1TecGctb5X3L68ysVBUzpTOk8ePiUkcdaeD1FwVMKmvpPCxlug+b74drIB1bEvQoys RL72CiUVwZ/xnw0guKINmtAuf7+MpUy0R0wQ52wz8CY249QXHzBebEJ6WaXHHx+wXSQX hAr4mc00pQGuqLEYV1v9msJGW+KgJa0hrg51XQ2hgBB++OLjXJQYymRdQHcOVtHgLzm4 q5nWriLu5BVHAfJIjZRz07s59dkVVT1kRcaHMqsL1Oa2rToIaInuhFVLNYBoWt7mapkY IXWQ== 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; bh=/XdGyzbxr+o22I/N5y4AB4fPx1K1PyOhlj9PNKFVT7I=; b=aKl2ILIdcW+P/Z05uTA7FlWtJ4rZs0Gkhm7TsNdhkxNC22iFtHUzxsmZ5VSxQbz3gw gHL7vj40U9EXbszRc5pvq0yqwSxiFKXDUijYSaIsp9AOjnQjyCtQhXNb27cy0/0SZlo8 S7s+4897nM3HMP1UgCwOLBwW77RpAOaeLrFUPzFAnJNwvfJeolZb04O2B9uMB5rm5JsN p5s+uuyxfgbyEZR0cQRNuno3/XXMUQ5ev4YgFrikT+1wCG3ehZUjSytpiqXIzl1rjLcy GX7Zxrc4wPHoSCJbSPR8Yxv2FMqhWeE6PINOSqTBR4e7VpoMoqwK7vuvQG66OUTJUml2 0F7A== X-Gm-Message-State: AKGB3mI+c4NH3fRsE51/UTXr9lUejKW4I0Q1uOC7Gyi0ePk9rNcJFwd5 rJ0BhcWleONKMJa1m7laG5mu7vTG X-Google-Smtp-Source: ACJfBosycdfUUoHUFP4FTqsyTGskdkrLvxosfR8oeHopcp9q5U/2t7KKqr9tjeny54DX1gO8t3I0Kw== X-Received: by 10.28.88.17 with SMTP id m17mr4613864wmb.93.1515238784975; Sat, 06 Jan 2018 03:39:44 -0800 (PST) Received: from p ([2001:4c50:25a:2900:445b:69ac:1812:576]) by smtp.gmail.com with ESMTPSA id d23sm8318703wma.48.2018.01.06.03.39.44 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 06 Jan 2018 03:39:44 -0800 (PST) From: Philipp To: bug-gnu-emacs@gnu.org Subject: 27.0.50; call-interactively doesn't work correctly if the interactive specification has an embedded null byte Date: Sat, 06 Jan 2018 12:39:43 +0100 Message-ID: MIME-Version: 1.0 Content-Type: text/plain X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -3.8 (---) X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.8 (---) For example, when evaluating (call-interactively (lambda (a b) (interactive "sa\0b\ns"))) the prompt is only "a" and a `wrong-number-of-argument' signal is raised. This is because `call-interactively' copies the interactive specification to a C string, ignoring embedded nulls. In GNU Emacs 27.0.50 (build 4, x86_64-apple-darwin17.3.0, NS appkit-1561.20 Version 10.13.2 (Build 17C88)) of 2018-01-02 built on p Repository revision: 1330afd3debc5a0d5d7d58a5db3f73f84b04be26 Windowing system distributor 'Apple', version 10.3.1561 System Description: Mac OS X 10.13.2 Recent messages: For information about GNU Emacs and the GNU system, type C-h C-a. Configured features: NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS JSON Important settings: value of $LANG: de_DE.UTF-8 locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message rmc puny seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib dired dired-loaddefs format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils elec-pair time-date tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/ns-win ns-win ucs-normalize mule-util term/common-win tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote kqueue cocoa ns multi-tty make-network-process emacs) Memory information: ((conses 16 204548 10161) (symbols 48 20150 1) (miscs 40 43 166) (strings 32 28872 1694) (string-bytes 1 770691) (vectors 16 35128) (vector-slots 8 719016 13106) (floats 8 48 68) (intervals 56 199 0) (buffers 992 11)) From debbugs-submit-bounces@debbugs.gnu.org Sat Jan 20 07:03:12 2018 Received: (at 30005) by debbugs.gnu.org; 20 Jan 2018 12:03:12 +0000 Received: from localhost ([127.0.0.1]:35612 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ecrrc-0007KJ-7O for submit@debbugs.gnu.org; Sat, 20 Jan 2018 07:03:12 -0500 Received: from eggs.gnu.org ([208.118.235.92]:49928) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ecrrZ-0007K5-PO for 30005@debbugs.gnu.org; Sat, 20 Jan 2018 07:03:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ecrrR-0004Tf-HK for 30005@debbugs.gnu.org; Sat, 20 Jan 2018 07:03:04 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:51139) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ecrrR-0004TZ-B9; Sat, 20 Jan 2018 07:03:01 -0500 Received: from [176.228.60.248] (port=3677 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1ecrrQ-00049m-N8; Sat, 20 Jan 2018 07:03:01 -0500 Date: Sat, 20 Jan 2018 14:02:42 +0200 Message-Id: <83y3ksspp9.fsf@gnu.org> From: Eli Zaretskii To: Philipp In-reply-to: (message from Philipp on Sat, 06 Jan 2018 12:39:43 +0100) Subject: Re: bug#30005: 27.0.50; call-interactively doesn't work correctly if the interactive specification has an embedded null byte References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30005 Cc: 30005@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) > From: Philipp > Date: Sat, 06 Jan 2018 12:39:43 +0100 > > (call-interactively (lambda (a b) (interactive "sa\0b\ns"))) > > the prompt is only "a" and a `wrong-number-of-argument' signal is > raised. This is because `call-interactively' copies the interactive > specification to a C string, ignoring embedded nulls. No, it copies the spec in its entirety, including embedded null bytes, but then _processes_ the result as a C string, taking the first null byte as the end of the string. Does the patch below look right, and give good results? diff --git a/src/callint.c b/src/callint.c index 2253cdf..3d2ed00 100644 --- a/src/callint.c +++ b/src/callint.c @@ -288,7 +288,8 @@ invoke it. If KEYS is omitted or nil, the return value of ptrdiff_t next_event; Lisp_Object prefix_arg; - char *string; + char *string, *string_end; + ptrdiff_t string_len; const char *tem; /* If varies[i] > 0, the i'th argument shouldn't just have its value @@ -396,6 +397,8 @@ invoke it. If KEYS is omitted or nil, the return value of /* SPECS is set to a string; use it as an interactive prompt. Copy it so that STRING will be valid even if a GC relocates SPECS. */ SAFE_ALLOCA_STRING (string, specs); + string_len = SBYTES (specs); + string_end = string + string_len; /* Here if function specifies a string to control parsing the defaults. */ @@ -418,7 +421,7 @@ invoke it. If KEYS is omitted or nil, the return value of if (!NILP (record_flag)) { char *p = string; - while (*p) + while (p < string_end) { if (! (*p == 'r' || *p == 'p' || *p == 'P' || *p == '\n')) @@ -469,7 +472,7 @@ invoke it. If KEYS is omitted or nil, the return value of `funcall-interactively') plus the number of arguments the interactive spec would have us give to the function. */ tem = string; - for (nargs = 2; *tem; ) + for (nargs = 2; tem < string_end; ) { /* 'r' specifications ("point and mark as 2 numeric args") produce *two* arguments. */ @@ -477,7 +480,7 @@ invoke it. If KEYS is omitted or nil, the return value of nargs += 2; else nargs++; - tem = strchr (tem, '\n'); + tem = memchr (tem, '\n', string_len - (tem - string)); if (tem) ++tem; else @@ -503,9 +506,12 @@ invoke it. If KEYS is omitted or nil, the return value of specbind (Qenable_recursive_minibuffers, Qt); tem = string; - for (i = 2; *tem; i++) + for (i = 2; tem < string_end; i++) { - visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n")); + char *pnl = memchr (tem + 1, '\n', string_len - (tem + 1 - string)); + ptrdiff_t sz = pnl ? pnl - (tem + 1) : string_end - (tem + 1); + + visargs[1] = make_string (tem + 1, sz); callint_message = Fformat_message (i - 1, visargs + 1); switch (*tem) @@ -781,7 +787,7 @@ invoke it. If KEYS is omitted or nil, the return value of { /* How many bytes are left unprocessed in the specs string? (Note that this excludes the trailing null byte.) */ - ptrdiff_t bytes_left = SBYTES (specs) - (tem - string); + ptrdiff_t bytes_left = string_len - (tem - string); unsigned letter; /* If we have enough bytes left to treat the sequence as a @@ -803,9 +809,9 @@ invoke it. If KEYS is omitted or nil, the return value of if (NILP (visargs[i]) && STRINGP (args[i])) visargs[i] = args[i]; - tem = strchr (tem, '\n'); + tem = memchr (tem, '\n', string_len - (tem - string)); if (tem) tem++; - else tem = ""; + else tem = string_end; } unbind_to (speccount, Qnil); From debbugs-submit-bounces@debbugs.gnu.org Mon Jan 22 17:25:58 2018 Received: (at 30005) by debbugs.gnu.org; 22 Jan 2018 22:25:59 +0000 Received: from localhost ([127.0.0.1]:38687 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1edkXO-0001IV-Gc for submit@debbugs.gnu.org; Mon, 22 Jan 2018 17:25:58 -0500 Received: from mail-lf0-f45.google.com ([209.85.215.45]:34209) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1edkXN-0001IG-3b for 30005@debbugs.gnu.org; Mon, 22 Jan 2018 17:25:57 -0500 Received: by mail-lf0-f45.google.com with SMTP id k19so12593425lfj.1 for <30005@debbugs.gnu.org>; Mon, 22 Jan 2018 14:25:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=8HXmW7i9fyCDgaq4lGHq66LkefykLZqON0vj7JS9otw=; b=YdfAnC/FudPM7Ncbd0HiVFI0nsgpSbO6+zlZZxdoFQnSx2ucJktmshg1LSUqfdS7zi uyG6eJiew69Y1ZjRrcZF/eZIJV7JCOVrdUUHocscdunZlHX1lgFRAfsmT4tI6OtT+C94 S62WGyC+gWKhfa/lYz3yhlKW4VSwMHWskwCUJ8ysMrNLXMOJ9ezdKEbzkvadGi4JTLWt BABZoOp8VeQrjZU38LPSiiojR4RPnowL7GdJypuwsoX1UYZQJfmnflFlHVfMY8HhvtLa j7bvIJAUA1GHZFZFWXYNQnlRLt3q5ohMeO4LJ8Ds+rhp/wslmPC9+H4epFi8qFy9SWOp 83RQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=8HXmW7i9fyCDgaq4lGHq66LkefykLZqON0vj7JS9otw=; b=R3nLAdszXktsxHo8Hiza0akpjFkFMWV5CuF34Up10DUAl5qXGtPVhcgGDaKPTa/kvo HbNvnv6hPPQmP3YMOrrqZN/TuZ48kaG3309BdNd3ECeohFG7Y42/WhG3wuIejgBsPEev hNDGzS9i1wyxO+S25bv1o62jKRpnYlySyNRb3U+QzkFY7do/K37fwPORNLzGOSSOMmyv nvbkEop6x/OMg7PdWyJaaNa2ROk2vj/VTLON7cag0iG5Bmshx8l4IF1aotExMNgzgMHV lCkyJq90WughV6j0QVLB7ri1Pozg0yR9so5np2I7zs7SsmVQeKL2xV2r0LZbvNJoFoPM b/7Q== X-Gm-Message-State: AKwxytcIWseLkA9qygCu7afTRR0D/wjeEQcBh/lG3HX7wXxewBm3jx/1 BqGUA6UA3tQ9Xc8XOnqfYvsRqTwPEItqNsQh3Sw= X-Google-Smtp-Source: AH8x227SlNDCsRHvGlurItoR7ZskUoaEZRikPcZbMxjT2Ph32pXxVXN061hTgk9d0rvSR4Te9XVUU61ZLAc/NsFA/Ik= X-Received: by 10.46.77.87 with SMTP id a84mr185995ljb.100.1516659950759; Mon, 22 Jan 2018 14:25:50 -0800 (PST) MIME-Version: 1.0 References: <83y3ksspp9.fsf@gnu.org> In-Reply-To: <83y3ksspp9.fsf@gnu.org> From: Philipp Stephani Date: Mon, 22 Jan 2018 22:25:39 +0000 Message-ID: Subject: Re: bug#30005: 27.0.50; call-interactively doesn't work correctly if the interactive specification has an embedded null byte To: Eli Zaretskii Content-Type: multipart/alternative; boundary="94eb2c1abb709c36d4056364e9a0" X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: 30005 Cc: 30005@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.2 (/) --94eb2c1abb709c36d4056364e9a0 Content-Type: text/plain; charset="UTF-8" Eli Zaretskii schrieb am Sa., 20. Jan. 2018 um 13:03 Uhr: > > From: Philipp > > Date: Sat, 06 Jan 2018 12:39:43 +0100 > > > > (call-interactively (lambda (a b) (interactive "sa\0b\ns"))) > > > > the prompt is only "a" and a `wrong-number-of-argument' signal is > > raised. This is because `call-interactively' copies the interactive > > specification to a C string, ignoring embedded nulls. > > No, it copies the spec in its entirety, including embedded null bytes, > but then _processes_ the result as a C string, taking the first null > byte as the end of the string. > > Does the patch below look right, and give good results? > Yes, thanks. Just some minor nits inline to make the code shorter. > > diff --git a/src/callint.c b/src/callint.c > index 2253cdf..3d2ed00 100644 > --- a/src/callint.c > +++ b/src/callint.c > @@ -288,7 +288,8 @@ invoke it. If KEYS is omitted or nil, the return > value of > ptrdiff_t next_event; > > Lisp_Object prefix_arg; > - char *string; > + char *string, *string_end; > + ptrdiff_t string_len; > I think these days (where we require C99) we always declare variables when we first use them. > const char *tem; > > /* If varies[i] > 0, the i'th argument shouldn't just have its value > @@ -396,6 +397,8 @@ invoke it. If KEYS is omitted or nil, the return > value of > /* SPECS is set to a string; use it as an interactive prompt. > Copy it so that STRING will be valid even if a GC relocates SPECS. > */ > SAFE_ALLOCA_STRING (string, specs); > + string_len = SBYTES (specs); > + string_end = string + string_len; > > /* Here if function specifies a string to control parsing the > defaults. */ > > @@ -418,7 +421,7 @@ invoke it. If KEYS is omitted or nil, the return > value of > if (!NILP (record_flag)) > { > char *p = string; > - while (*p) > + while (p < string_end) > { > if (! (*p == 'r' || *p == 'p' || *p == 'P' > || *p == '\n')) > @@ -469,7 +472,7 @@ invoke it. If KEYS is omitted or nil, the return > value of > `funcall-interactively') plus the number of arguments the > interactive spec > would have us give to the function. */ > tem = string; > - for (nargs = 2; *tem; ) > + for (nargs = 2; tem < string_end; ) > { > /* 'r' specifications ("point and mark as 2 numeric args") > produce *two* arguments. */ > @@ -477,7 +480,7 @@ invoke it. If KEYS is omitted or nil, the return > value of > nargs += 2; > else > nargs++; > - tem = strchr (tem, '\n'); > + tem = memchr (tem, '\n', string_len - (tem - string)); > You can write the third argument as string_end - tem. > if (tem) > ++tem; > else > @@ -503,9 +506,12 @@ invoke it. If KEYS is omitted or nil, the return > value of > specbind (Qenable_recursive_minibuffers, Qt); > > tem = string; > - for (i = 2; *tem; i++) > + for (i = 2; tem < string_end; i++) > { > - visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n")); > + char *pnl = memchr (tem + 1, '\n', string_len - (tem + 1 - string)); > Here you can write the third argument as string_end - (tem + 1). > + ptrdiff_t sz = pnl ? pnl - (tem + 1) : string_end - (tem + 1); > You can write the RHS as (pnl ? pnl : string_end) - (tem + 1). > + > + visargs[1] = make_string (tem + 1, sz); > callint_message = Fformat_message (i - 1, visargs + 1); > > switch (*tem) > @@ -781,7 +787,7 @@ invoke it. If KEYS is omitted or nil, the return > value of > { > /* How many bytes are left unprocessed in the specs string? > (Note that this excludes the trailing null byte.) */ > - ptrdiff_t bytes_left = SBYTES (specs) - (tem - string); > + ptrdiff_t bytes_left = string_len - (tem - string); > Same (string-end - tem). > unsigned letter; > > /* If we have enough bytes left to treat the sequence as a > @@ -803,9 +809,9 @@ invoke it. If KEYS is omitted or nil, the return > value of > if (NILP (visargs[i]) && STRINGP (args[i])) > visargs[i] = args[i]; > > - tem = strchr (tem, '\n'); > + tem = memchr (tem, '\n', string_len - (tem - string)); > again, string_end - tem. > if (tem) tem++; > - else tem = ""; > + else tem = string_end; > } > unbind_to (speccount, Qnil); > > --94eb2c1abb709c36d4056364e9a0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Eli Zaretskii <eli= z@gnu.org> schrieb am Sa., 20. Jan. 2018 um 13:03=C2=A0Uhr:
> From: Phili= pp <p.stephan= i2@gmail.com>
> Date: Sat, 06 Jan 2018 12:39:43 +0100
>
> (call-interactively (lambda (a b) (interactive "sa\0b\ns")))=
>
> the prompt is only "a" and a `wrong-number-of-argument' = signal is
> raised.=C2=A0 This is because `call-interactively' copies the inte= ractive
> specification to a C string, ignoring embedded nulls.

No, it copies the spec in its entirety, including embedded null bytes,
but then _processes_ the result as a C string, taking the first null
byte as the end of the string.

Does the patch below look right, and give good results?

Yes, thanks. Just some minor nits inline to make the code = shorter.
=C2=A0

diff --git a/src/callint.c b/src/callint.c
index 2253cdf..3d2ed00 100644
--- a/src/callint.c
+++ b/src/callint.c
@@ -288,7 +288,8 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0ptrdiff_t next_event;

=C2=A0 =C2=A0Lisp_Object prefix_arg;
-=C2=A0 char *string;
+=C2=A0 char *string, *string_end;
+=C2=A0 ptrdiff_t string_len;

I think t= hese days (where we require C99) we always declare variables when we first = use them.
=C2=A0
=C2=A0 =C2=A0const char *tem;

=C2=A0 =C2=A0/* If varies[i] > 0, the i'th argument shouldn't ju= st have its value
@@ -396,6 +397,8 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0/* SPECS is set to a string; use it as an interactive prompt.<= br> =C2=A0 =C2=A0 =C2=A0 Copy it so that STRING will be valid even if a GC relo= cates SPECS.=C2=A0 */
=C2=A0 =C2=A0SAFE_ALLOCA_STRING (string, specs);
+=C2=A0 string_len =3D SBYTES (specs);
+=C2=A0 string_end =3D string + string_len;

=C2=A0 =C2=A0/* Here if function specifies a string to control parsing the = defaults.=C2=A0 */

@@ -418,7 +421,7 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!NILP (record_flag)) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 char *p =3D = string;
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0while (*p) +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0while (p <= ; string_end)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 if (! (*p =3D=3D 'r' || *p =3D=3D 'p' || *p =3D=3D '= ;P'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|| *p =3D=3D '\n'))
@@ -469,7 +472,7 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0 =C2=A0 `funcall-interactively') plus the number of argume= nts the interactive spec
=C2=A0 =C2=A0 =C2=A0 would have us give to the function.=C2=A0 */
=C2=A0 =C2=A0tem =3D string;
-=C2=A0 for (nargs =3D 2; *tem; )
+=C2=A0 for (nargs =3D 2; tem < string_end; )
=C2=A0 =C2=A0 =C2=A0{
=C2=A0 =C2=A0 =C2=A0 =C2=A0/* 'r' specifications ("point and m= ark as 2 numeric args")
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0produce *two* arguments.=C2=A0 */
@@ -477,7 +480,7 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0 =C2=A0 =C2=A0 nargs +=3D 2;
=C2=A0 =C2=A0 =C2=A0 =C2=A0else
=C2=A0 =C2=A0 =C2=A0 =C2=A0 nargs++;
-=C2=A0 =C2=A0 =C2=A0 tem =3D strchr (tem, '\n');
+=C2=A0 =C2=A0 =C2=A0 tem =3D memchr (tem, '\n', string_len - (tem = - string));

You can write the third arg= ument as string_end - tem.
=C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0if (tem)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ++tem;
=C2=A0 =C2=A0 =C2=A0 =C2=A0else
@@ -503,9 +506,12 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return= value of
=C2=A0 =C2=A0 =C2=A0specbind (Qenable_recursive_minibuffers, Qt);

=C2=A0 =C2=A0tem =3D string;
-=C2=A0 for (i =3D 2; *tem; i++)
+=C2=A0 for (i =3D 2; tem < string_end; i++)
=C2=A0 =C2=A0 =C2=A0{
-=C2=A0 =C2=A0 =C2=A0 visargs[1] =3D make_string (tem + 1, strcspn (tem + 1= , "\n"));
+=C2=A0 =C2=A0 =C2=A0 char *pnl =3D memchr (tem + 1, '\n', string_l= en - (tem + 1 - string));

Here you can = write the third argument as string_end - (tem=C2=A0+ 1).
=C2=A0
+=C2=A0 =C2=A0 =C2=A0 ptrdiff_t sz =3D pnl ? pnl - (tem + 1) : string_end -= (tem + 1);

You can write the RHS as (p= nl ? pnl : string_end) - (tem=C2=A0+ 1).
=C2=A0
+
+=C2=A0 =C2=A0 =C2=A0 visargs[1] =3D make_string (tem + 1, sz);
=C2=A0 =C2=A0 =C2=A0 =C2=A0callint_message =3D Fformat_message (i - 1, visa= rgs + 1);

=C2=A0 =C2=A0 =C2=A0 =C2=A0switch (*tem)
@@ -781,7 +787,7 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* How many bytes are left unproc= essed in the specs string?
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(Note that this excl= udes the trailing null byte.)=C2=A0 */
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ptrdiff_t bytes_left =3D SBYTES (= specs) - (tem - string);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ptrdiff_t bytes_left =3D string_l= en - (tem - string);

Same (string-end -= tem).
=C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned letter;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* If we have enough bytes left t= o treat the sequence as a
@@ -803,9 +809,9 @@ invoke it.=C2=A0 If KEYS is omitted or nil, the return = value of
=C2=A0 =C2=A0 =C2=A0 =C2=A0if (NILP (visargs[i]) && STRINGP (args[i= ]))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 visargs[i] =3D args[i];

-=C2=A0 =C2=A0 =C2=A0 tem =3D strchr (tem, '\n');
+=C2=A0 =C2=A0 =C2=A0 tem =3D memchr (tem, '\n', string_len - (tem = - string));

again, string_end - tem.
=C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0if (tem) tem++;
-=C2=A0 =C2=A0 =C2=A0 else tem =3D "";
+=C2=A0 =C2=A0 =C2=A0 else tem =3D string_end;
=C2=A0 =C2=A0 =C2=A0}
=C2=A0 =C2=A0unbind_to (speccount, Qnil);

--94eb2c1abb709c36d4056364e9a0-- From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 23 10:56:02 2018 Received: (at 30005) by debbugs.gnu.org; 23 Jan 2018 15:56:02 +0000 Received: from localhost ([127.0.0.1]:39796 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ee0va-0000lm-0n for submit@debbugs.gnu.org; Tue, 23 Jan 2018 10:56:02 -0500 Received: from eggs.gnu.org ([208.118.235.92]:48057) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ee0vY-0000lT-RA for 30005@debbugs.gnu.org; Tue, 23 Jan 2018 10:56:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee0vQ-0001RU-HE for 30005@debbugs.gnu.org; Tue, 23 Jan 2018 10:55:55 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:57654) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee0vQ-0001RD-EB; Tue, 23 Jan 2018 10:55:52 -0500 Received: from [176.228.60.248] (port=4567 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1ee0vP-0000N3-9c; Tue, 23 Jan 2018 10:55:51 -0500 Date: Tue, 23 Jan 2018 17:55:41 +0200 Message-Id: <83shawzi0y.fsf@gnu.org> From: Eli Zaretskii To: Philipp Stephani In-reply-to: (message from Philipp Stephani on Mon, 22 Jan 2018 22:25:39 +0000) Subject: Re: bug#30005: 27.0.50; call-interactively doesn't work correctly if the interactive specification has an embedded null byte References: <83y3ksspp9.fsf@gnu.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30005 Cc: 30005@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Eli Zaretskii Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) > From: Philipp Stephani > Date: Mon, 22 Jan 2018 22:25:39 +0000 > Cc: 30005@debbugs.gnu.org > > Does the patch below look right, and give good results? > > Yes, thanks. Just some minor nits inline to make the code shorter. Thanks for the review. I eventually pushed the changes as presented here, for the reasons I explain below. > Lisp_Object prefix_arg; > - char *string; > + char *string, *string_end; > + ptrdiff_t string_len; > > I think these days (where we require C99) we always declare variables when we first use them. That's not my understanding of the preferred style. My understanding, and what I do in practice, is that variables used only in a small portion of a function should be declared before the use, so that all the references to those variables are localized to the fragment where they are used. By contrast, in this case these variables are used all over the function, so it makes much less sense to delay their declaration. > - tem = strchr (tem, '\n'); > + tem = memchr (tem, '\n', string_len - (tem - string)); > > You can write the third argument as string_end - tem. Yes, but IMO the above is easier to convince the reader that the code is correct, and an optimizing compiler will produce the same code from both. > - visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n")); > + char *pnl = memchr (tem + 1, '\n', string_len - (tem + 1 - string)); > > Here you can write the third argument as string_end - (tem + 1). Same here: I find the code I used easier to understand and verify its correctness. > + ptrdiff_t sz = pnl ? pnl - (tem + 1) : string_end - (tem + 1); > > You can write the RHS as (pnl ? pnl : string_end) - (tem + 1). Same here. Thanks. From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 23 13:06:46 2018 Received: (at 30005) by debbugs.gnu.org; 23 Jan 2018 18:06:46 +0000 Received: from localhost ([127.0.0.1]:39861 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ee2y6-0004Ws-Hr for submit@debbugs.gnu.org; Tue, 23 Jan 2018 13:06:46 -0500 Received: from eggs.gnu.org ([208.118.235.92]:57945) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ee2y4-0004We-CB for 30005@debbugs.gnu.org; Tue, 23 Jan 2018 13:06:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee2xy-0003q2-14 for 30005@debbugs.gnu.org; Tue, 23 Jan 2018 13:06:39 -0500 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD autolearn=disabled version=3.3.2 Received: from fencepost.gnu.org ([2001:4830:134:3::e]:60455) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee2xw-0003nl-Cq; Tue, 23 Jan 2018 13:06:36 -0500 Received: from rms by fencepost.gnu.org with local (Exim 4.82) (envelope-from ) id 1ee2xv-0006ay-Pa; Tue, 23 Jan 2018 13:06:35 -0500 Content-Type: text/plain; charset=Utf-8 From: Richard Stallman To: Eli Zaretskii In-reply-to: <83shawzi0y.fsf@gnu.org> (message from Eli Zaretskii on Tue, 23 Jan 2018 17:55:41 +0200) Subject: Re: bug#30005: 27.0.50; call-interactively doesn't work correctly if the interactive specification has an embedded null byte References: <83y3ksspp9.fsf@gnu.org> <83shawzi0y.fsf@gnu.org> Message-Id: Date: Tue, 23 Jan 2018 13:06:35 -0500 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: 30005 Cc: 30005@debbugs.gnu.org, p.stephani2@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: rms@gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) [[[ To any NSA and FBI agents reading my email: please consider ]]] [[[ whether defending the US Constitution against all enemies, ]]] [[[ foreign or domestic, requires you to follow Snowden's example. ]]] > That's not my understanding of the preferred style. My understanding, > and what I do in practice, is that variables used only in a small > portion of a function should be declared before the use, so that all > the references to those variables are localized to the fragment where > they are used. By contrast, in this case these variables are used all > over the function, so it makes much less sense to delay their > declaration. I agree. -- Dr Richard Stallman President, Free Software Foundation (https://gnu.org, https://fsf.org) Internet Hall-of-Famer (https://internethalloffame.org) Skype: No way! See https://stallman.org/skype.html. From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 03 16:48:12 2018 Received: (at 30005) by debbugs.gnu.org; 3 Feb 2018 21:48:12 +0000 Received: from localhost ([127.0.0.1]:56031 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ei5fQ-00021v-Hk for submit@debbugs.gnu.org; Sat, 03 Feb 2018 16:48:12 -0500 Received: from mail-it0-f51.google.com ([209.85.214.51]:50463) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ei5fP-00021b-Cc; Sat, 03 Feb 2018 16:48:11 -0500 Received: by mail-it0-f51.google.com with SMTP id x128so12656864ite.0; Sat, 03 Feb 2018 13:48:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=nHGpQKeOtTmaayQOa0nv8iuSI93TqI6zLtTWjFpSBRM=; b=i4yphGQT5ae/dWxKUYB9XW/03EcUpuCFeyb7uoP9ynQTmO9+sE9WK0j/K0rPNTgc1N PD0ywP7BpOmOSmDbgygqJzaZdYUZZwEkPxY6LMs4Z4MXhSIs1xQCQ7HNS1oTCGm7vAkX 9Kat1nxgStTrjaEezZC/FTTwLlgedumfbSVeBu+WrNp4lDd74cDLFIIPvP1NmZqD7J0B 5qwAK3eR7rhHF+ewl7608oU+MaKfdYDsz4SdTQi6ASMT9w70TCLPght8c+TpIeUqJBQi 14T2PnXC/KA9P7c6Le0/NsrstwJCPuqyexKgkMyjFqFcbg4udpMYLeU+/AkBywFrsARl 7oSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:references:date :in-reply-to:message-id:user-agent:mime-version; bh=nHGpQKeOtTmaayQOa0nv8iuSI93TqI6zLtTWjFpSBRM=; b=kw9SUBJ0Uj7EfzsI5OVicJ0OPHSQlgVsTidSx9thDiMCRjS2++Fhri2zwge6dLFyyv Y3sWL5WYQVtwfXMB128qUi79eCU7M568Pb4D9f52suCAkwBBrU6R3wBbEqH85N/5R7OK rGlOKg2x/GSaoMDF9pbQz/KMAZpstB8+2vYjG3WKa1S2RVIMJsdWzYcflmZogpgDLgre /yBiF/IRUXxJjM1s6S5/JRgBONvJzPggqhe9L559zVa7dZVThIwGnSQsRcoN/1fSDCI4 ezSN+Znr4QP3FH/tr1W4136MJVstE/iMshrI9E/MEoryEYl85jU3vgOBqJ3jr9F9Xabu HoVA== X-Gm-Message-State: AKwxytcBuVRtZGvV1dmU418jac79NmAd2rg5NdCyOMzypaPu+YHc5YzI iTgpuTAo+tgqQTox/bH8juVuBA== X-Google-Smtp-Source: AH8x225ojMKj5nxsPMvxyMYAgwDsMQaRK9P9J6hQcWmnQSCLkQ7Y51zSrpPhs+vW8tjCUvljvBgH3A== X-Received: by 10.36.178.26 with SMTP id u26mr31561449ite.4.1517694485314; Sat, 03 Feb 2018 13:48:05 -0800 (PST) Received: from zebian (cbl-45-2-119-34.yyz.frontiernetworks.ca. [45.2.119.34]) by smtp.googlemail.com with ESMTPSA id k68sm3317724itc.12.2018.02.03.13.48.03 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 03 Feb 2018 13:48:04 -0800 (PST) From: Noam Postavsky To: Eli Zaretskii Subject: Re: bug#30005: 27.0.50; call-interactively doesn't work correctly if the interactive specification has an embedded null byte References: <83y3ksspp9.fsf@gnu.org> <83shawzi0y.fsf@gnu.org> Date: Sat, 03 Feb 2018 16:48:03 -0500 In-Reply-To: <83shawzi0y.fsf@gnu.org> (Eli Zaretskii's message of "Tue, 23 Jan 2018 17:55:41 +0200") Message-ID: <87h8qxg2y4.fsf@users.sourceforge.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.90 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.5 (/) X-Debbugs-Envelope-To: 30005 Cc: 30005@debbugs.gnu.org, Philipp Stephani X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.5 (/) tags 30005 fixed close 30005 27.1 quit Eli Zaretskii writes: >> From: Philipp Stephani >> Date: Mon, 22 Jan 2018 22:25:39 +0000 >> Cc: 30005@debbugs.gnu.org >> >> Does the patch below look right, and give good results? >> >> Yes, thanks. Just some minor nits inline to make the code shorter. > > Thanks for the review. I eventually pushed the changes Closing. [1: 6d836771da]: 2018-01-23 17:48:08 +0200 Support null characters in interactive specs https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=6d836771da7e9a6a67fcd18e52dd16de1cdc154e From unknown Mon Aug 18 14:24:51 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sun, 04 Mar 2018 12:24:03 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator