From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 10801 invoked by alias); 5 Mar 2017 22:31:10 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 40746 Received: (qmail 2922 invoked from network); 5 Mar 2017 22:31:10 -0000 X-Qmail-Scanner-Diagnostics: from park01.gkg.net by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(205.235.26.22):SA:0(0.5/5.0):. Processed in 0.469882 secs); 05 Mar 2017 22:31:10 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_SORBS_SPAM,RP_MATCHES_RCVD,T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.1 X-Envelope-From: SRS0=L5oX=2O=brasslantern.com=schaefer@bounces.park01.gkg.net X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: none (ns1.primenet.com.au: domain at bounces.park01.gkg.net does not designate permitted sender hosts) X-Virus-Scanned: by amavisd-new at gkg.net Authentication-Results: amavisd4.gkg.net (amavisd-new); dkim=pass (2048-bit key) header.d=brasslantern-com.20150623.gappssmtp.com X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:in-reply-to:comments:references:to:subject:cc :mime-version; bh=0cw1wf64+XGQuuCMlmZFPl0Uki00MzzFF0WR83CTNFo=; b=m0Fhd34f0eqVlPsfs2f84+I8YncErTQj+iooKoHhYJ7wYkKvUq/P9xAqmY6gzv7yb+ +LOT1S8GcjZENq1FX0YYQ1d84rZ6vJ52XviSdRhsnaWY/azYu2bZ8Iu/4FjBJWbJEpch dF1Rf6eEY1dtTull3kdYXCu11EM0VyJi3P7iJz8YHDEolR/eOGYq7sCnkLRhoepV0I1U 3tF1X2LRz00jccJCX9eMBvglThLfF1vsCnGwQUovTlJN8foZ6J9iwUF1x6veQn9d+t+I GmYDnn3feEM6wLkrrZy9c7shr4YYufEDCtIeIwF5yHNO5a8MLSXGORZpiKgj+BVjGxD6 EKWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:message-id:date:in-reply-to:comments :references:to:subject:cc:mime-version; bh=0cw1wf64+XGQuuCMlmZFPl0Uki00MzzFF0WR83CTNFo=; b=V+qMkPMo+ppJ9FLRRMyMvrYFIMzmbcafbpsPfyXSgXmeaXTkKNgG2STkpr+W1JPs3g kl+x4Vuz2a46vdeuKBAptpYxHfqRoWZwDIdvnMtMWSBUab3rm5aJNlEzzgh6yG+R9qjF 7c1o/r6yAeUd+vaA676pxtMuCyePLqvbT7H/9MH3+3x1CMgISGkX0Pa7l9EOvATjEG5V 03Pf/XoUH/R6WvGE62ibC5aYOPtyORUxaGTxcN3peuRLL2E33ig/ZV2fhZfromktK8FX +dvDt1nLnEFPeM4LhzYg9gWZDwEnnfZv5kiDWegVSiIPgvBaqKEs3D7GIRBYfxVHO8ZM rdCQ== X-Gm-Message-State: AMke39nWsFXp/UDf0iWWzpR8CjAF3TS42impZZBaf1lkQnlZdUyWRUkH5dYekX2S5Rp5QA== X-Received: by 10.31.161.137 with SMTP id k131mr5768649vke.12.1488753055053; Sun, 05 Mar 2017 14:30:55 -0800 (PST) From: Bart Schaefer Message-Id: <170305143118.ZM3173@torch.brasslantern.com> Date: Sun, 5 Mar 2017 14:31:18 -0800 In-Reply-To: <170305134513.ZM26364@torch.brasslantern.com> Comments: In reply to Bart Schaefer "Re: [BUG] SIGSEGV under certain circumstances" (Mar 5, 1:45pm) References: <170304151137.ZM30694@torch.brasslantern.com> <170305080054.ZM24832@torch.brasslantern.com> <20170305161720.6f3773d6@ntlworld.com> <170305104239.ZM25231@torch.brasslantern.com> <5096E600-D76C-4F71-BE93-C46F256BA7D7@ntlworld.com> <170305134513.ZM26364@torch.brasslantern.com> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: zsh-workers@zsh.org Subject: Re: [BUG] SIGSEGV under certain circumstances Cc: Chi-Hsuan Yen MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii On Mar 5, 1:45pm, Bart Schaefer wrote: } } This will fail in this case, I would think? We have to unmetafy first, } possibly several bytes ahead, and THEN attempt multibyte conversion; } not do either one or the other? So the following is probably deeply in need of optimization (needs a version of unmeta() that stops after the widest possible mutltibyte character), but just to check my hypothesis: diff --git a/Src/Zle/compmatch.c b/Src/Zle/compmatch.c index aedf463..b0252c2 100644 --- a/Src/Zle/compmatch.c +++ b/Src/Zle/compmatch.c @@ -1548,7 +1548,7 @@ pattern_match(Cpattern p, char *s, Cpattern wp, char *ws) { convchar_t c, wc; convchar_t ind, wind; - int len = 0, wlen, mt, wmt; + int len = 0, wlen = 0, mt, wmt; #ifdef MULTIBYTE_SUPPORT mbstate_t lstate, wstate; @@ -1559,7 +1559,13 @@ pattern_match(Cpattern p, char *s, Cpattern wp, char *ws) while (p && wp && *s && *ws) { /* First test the word character */ #ifdef MULTIBYTE_SUPPORT - wlen = mb_metacharlenconv_r(ws, &wc, &wstate); + int ulen = mb_metacharlenconv_r(unmeta(ws), &wc, &wstate); + while (ulen-- > 0) { + if (ws[wlen] == Meta) + wlen += 2; + else + wlen += 1; + } #else if (*ws == Meta) { wc = STOUC(ws[1]) ^ 32; @@ -1577,7 +1583,13 @@ pattern_match(Cpattern p, char *s, Cpattern wp, char *ws) * Now the line character. */ #ifdef MULTIBYTE_SUPPORT - len = mb_metacharlenconv_r(s, &c, &lstate); + ulen = mb_metacharlenconv_r(unmeta(s), &c, &lstate); + while (ulen-- > 0) { + if (s[len] == Meta) + len += 2; + else + len += 1; + } #else /* We have the character itself. */ if (*s == Meta) { @@ -1624,11 +1636,20 @@ pattern_match(Cpattern p, char *s, Cpattern wp, char *ws) ws += wlen; p = p->next; wp = wp->next; +#ifdef MULTIBYTE_SUPPORT + len = wlen = 0; +#endif } while (p && *s) { #ifdef MULTIBYTE_SUPPORT - len = mb_metacharlenconv_r(s, &c, &lstate); + int ulen = mb_metacharlenconv_r(unmeta(s), &c, &lstate); + while (ulen-- > 0) { + if (s[len] == Meta) + len += 2; + else + len += 1; + } #else if (*s == Meta) { c = STOUC(s[1]) ^ 32; @@ -1642,11 +1663,20 @@ pattern_match(Cpattern p, char *s, Cpattern wp, char *ws) return 0; p = p->next; s += len; +#ifdef MULTIBYTE_SUPPORT + len = 0; +#endif } while (wp && *ws) { #ifdef MULTIBYTE_SUPPORT - wlen = mb_metacharlenconv_r(ws, &wc, &wstate); + int ulen = mb_metacharlenconv_r(unmeta(ws), &wc, &wstate); + while (ulen-- > 0) { + if (ws[wlen] == Meta) + wlen += 2; + else + wlen += 1; + } #else if (*ws == Meta) { wc = STOUC(ws[1]) ^ 32; @@ -1660,6 +1690,9 @@ pattern_match(Cpattern p, char *s, Cpattern wp, char *ws) return 0; wp = wp->next; ws += wlen; +#ifdef MULTIBYTE_SUPPORT + wlen = 0; +#endif } return 1;