zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: "zsh-workers@zsh.org" <zsh-workers@zsh.org>
Subject: Re: [BUG] Zsh crashes when using autocomplete because of memory unsafety (double free)
Date: Sun, 28 Jun 2020 12:27:29 -0700	[thread overview]
Message-ID: <CAH+w=7ZG2Gg1eby+qU62iLrB5cvshhqokvPCd9cKFdmJ4u_GzA@mail.gmail.com> (raw)
In-Reply-To: <CAH+w=7YVxqB5-TSO8QNvJajjv_MxnmWijd9PX=wkzXNu-GKGmg@mail.gmail.com>

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

On Sun, Jun 28, 2020 at 12:09 AM Bart Schaefer <schaefer@brasslantern.com>
wrote:

>
> % autoload compinit
> % compinit -D
> % setopt completeinword
> % alias a='"<left><TAB>
>
> I think it has to do with
> compset -P 1 '*='
> compset -q
>
> So, what's happening is that a=' turns into a=\"
>

Just to clarify, you can actually watch this happening in gdb if you set a
watchpoint on "offs" and step through a few instructions.

toltec-ubuntu% alias a='"
Hardware watchpoint 1: offs

Old value = 3
New value = 2
get_comp_string () at zle_tricky.c:1883
1883    if (*p == Snull && isset(RCQUOTES))
(gdb) p p
$24 = 0x865592 "\235\""
(gdb) p zlemetaline
$25 = 0x8b7a40 "alias a='\""
(gdb) n
1885    if (p[1] || *p != Bnull) {
(gdb) n
1886 if (*p == Bnull) {
(gdb)
1890    ocs = zlemetacs;
(gdb)
1891    zlemetacs = i;
(gdb) p ocs
$26 = 9
(gdb) n
1892    foredel(skipchars, CUT_RAW);
(gdb) n
1893    if ((zlemetacs = ocs) > --i) {
(gdb) p skipchars
$27 = 1
(gdb) p zlemetaline
$28 = 0x8b7a40 "alias a=\""
(gdb) where 2
#0  get_comp_string () at zle_tricky.c:1893
#1  0x0000000000545b5c in docomplete (lst=4) at zle_tricky.c:664


> and consequently increases the offset by one, but then
>

I think this diagnosis is wrong -- it's not that the offset is increased,
it's that zlemetaline is shortened (by removal of the single quote).

The end result is the same, though -- the start of the word is calculated
by subtracting the offset from the current position, and the resulting
index is off the left end.

Having gotten that far, though, I don't know how to fix it.
>

The following may do it?  Completion tests still pass.  Without the change:

% autoload compinit zed
% compinit -D
% zstyle \* format %d
% alias a='<TAB>
% alias a=

With this change the vanishing quote mark no longer vanishes and a
description appears:

% autoload compinit zed
% compinit -D
% zstyle \* format %d
% alias a='<TAB>
`alias definition', `regular alias', `global alias', or `suffix alias'
alias definition
% alias a='

And the crash no longer happens when something appears after the single
quote.

I note that offs gets changed in the loop in an outer "else"-branch when
foredel/backdel are not called, too.  However, I'm not certain that the
edit should appear in BOTH hunks below.  Can anyone find any other test
cases that pass through this code?

diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index fdd1687..2c24a13 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -1897,6 +1897,7 @@ get_comp_string(void)
                            zlemetacs = wb;
                    }
                    we -= skipchars;
+                   offs -= skipchars;
                }
            } else {
                ocs = zlemetacs;
@@ -1910,6 +1911,7 @@ get_comp_string(void)
                if (wb > zlemetacs)
                    zlemetacs = wb;
                we -= skipchars;
+               offs -= skipchars;
            }
            /* we need to get rid of all the quotation bits... */
            while (skipchars--)

  reply	other threads:[~2020-06-28 19:28 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-26 15:03 Petr Šťastný
2020-06-26 16:24 ` Daniel Shahaf
2020-06-26 16:32   ` Roman Perepelitsa
2020-06-26 17:17     ` zsh/lldb (was: Re: [BUG] Zsh crashes when using autocomplete because of memory unsafety (double free)) Daniel Shahaf
2020-06-28  7:09   ` [BUG] Zsh crashes when using autocomplete because of memory unsafety (double free) Bart Schaefer
2020-06-28 19:27     ` Bart Schaefer [this message]
2020-06-28 19:35       ` Bart Schaefer
2020-06-29  3:48         ` Bart Schaefer
2020-07-04 20:20           ` Bart Schaefer
2020-06-27 21:08 Petr Šťastný

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

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

  git send-email \
    --in-reply-to='CAH+w=7ZG2Gg1eby+qU62iLrB5cvshhqokvPCd9cKFdmJ4u_GzA@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=zsh-workers@zsh.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.vuxu.org/mirror/zsh/

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 NNTP newsgroup(s).