Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm
Precedence: bulk
X-No-Archive: yes
List-Id: Zsh Workers List <zsh-workers.zsh.org>
List-Post: <mailto:zsh-workers@zsh.org>
List-Help: <mailto:zsh-workers-help@zsh.org>
X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID
	autolearn=ham autolearn_force=no version=3.4.1
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
         :mime-version;
        bh=IFxHeZ8pFNM3K0fZXnGhLy+B989rEGz4em7i6Iz260o=;
        b=saQhnOYOn4aH35WTjyLuUD4Sp/x9vRiTItB9lqez7PVLP5tRyzpcvZq8d/zlxQNTEx
         vAeZxvcLOWP22+LXSQRlZD5GfL33rAJfqSLd9Ti+qjhtxGqXDFEUii/w+TZ3gmBJ0B0u
         jFAC6eVGq0B48J2ujfmQpAe8a093/dF2KBXIieequx2AtwY4TYm/BWWuN8V4ebhTtJ6Q
         BjdfhRW6JZ3jv/88Wf9QCZ16VRNiF108R9Z4uZfzJYFLkK5MrAWf86b2T/qdG+G75BjW
         Mcxoavm2W2GnlpCTx2GQalmbVQNDyWsD0whGhirGJILxdi7Vt+oBahUbDJRQSa5sJd/1
         nySg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:from:message-id:date:in-reply-to:comments
         :references:to:subject:mime-version;
        bh=IFxHeZ8pFNM3K0fZXnGhLy+B989rEGz4em7i6Iz260o=;
        b=b4WII6jxRTPEEASq10OTsf1zwf1LFsQxosNpZ2WOV6QyHqPq45BA+iVF/jMFGcRVHz
         J/7AsKWZWwbnzujEWsTsn0y6SkSJ4MWJvvL03Zio/Yo82eIgyAIVXi6pdGaPa+d/TNMT
         /1g6iTu7vwBsNw3Cj/acTlJrcN8gzhE5PeiTDscG2ZvC9TiN/LmDOrWBJrddz9oJB4JT
         6vBTe9DQYYq30pSvvnebPnfBGiGNK6snA/qLcXwoR/CRoWyfAHI+ccBTa1bwRdZliWMj
         BoMDuVgAjHO1ji14kNejwEm/4/FNTXAHoURJuA/6sT9cz7ivWXFxZURGtczpMIyc0fP4
         eCjw==
X-Gm-Message-State: AD7BkJJxR28imxXU2kcAGIx+xOhb9Fype9imjq9xo8hluPAMipP/QfharHKlfq4kxP9rsQ==
X-Received: by 10.66.225.177 with SMTP id rl17mr25043709pac.46.1457804046701;
        Sat, 12 Mar 2016 09:34:06 -0800 (PST)
From: Bart Schaefer <schaefer@brasslantern.com>
Message-Id: <160312093420.ZM14020@torch.brasslantern.com>
Date: Sat, 12 Mar 2016 09:34:20 -0800
In-Reply-To: <160312082029.ZM2340@torch.brasslantern.com>
Comments: In reply to Bart Schaefer <schaefer@brasslantern.com>
        "Re: segfault in completion for configure" (Mar 12,  8:20am)
References: <20160311134729.GA32476@cventin.lip.ens-lyon.fr> 
	<20160311143202.4008e29b@pwslap01u.europe.root.pri> 
	<160311150056.ZM30997@torch.brasslantern.com> 
	<20160312031116.GC28459@zira.vinc17.org> 
	<160312082029.ZM2340@torch.brasslantern.com>
X-Mailer: OpenZMail Classic (0.9.2 24April2005)
To: zsh-workers@zsh.org
Subject: Re: segfault in completion for configure
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Seq: zsh-workers 38142

On Mar 12,  8:20am, Bart Schaefer wrote:
}
} I'm guessing that re-entering pattern matching during the signal handler
} is messing up those globals and leading eventually to the crash.

Try the patch below?  Unfortunately this is likely to slow Jesper's
massive glob a little more.  The right thing would be to factor out
the globals, but there are about 100 references to them so that's
going to be a large code change.


diff --git a/Src/pattern.c b/Src/pattern.c
index 72c7d97..fa9fefb 100644
--- a/Src/pattern.c
+++ b/Src/pattern.c
@@ -537,9 +537,14 @@ patcompile(char *exp, int inflags, char **endexp)
     Upat pscan;
     char *lng, *strp = NULL;
     Patprog p;
+    int savpatflags, savpatglobflags;
 
     queue_signals();
 
+    /* In case called from a signal handler before queuing */
+    savpatflags = patflags;
+    savpatglobflags = patglobflags;
+
     startoff = sizeof(struct patprog);
     /* Ensure alignment of start of program string */
     startoff = (startoff + sizeof(union upat) - 1) & ~(sizeof(union upat) - 1);
@@ -603,6 +608,8 @@ patcompile(char *exp, int inflags, char **endexp)
 	    /* No, do normal compilation. */
 	    strp = NULL;
 	    if (patcompswitch(0, &flags) == 0) {
+		patflags = savpatflags;
+		patglobflags = savpatglobflags;
 		unqueue_signals();
 		return NULL;
 	    }
@@ -738,6 +745,8 @@ patcompile(char *exp, int inflags, char **endexp)
     if (endexp)
 	*endexp = patparse;
 
+    patflags = savpatflags;
+    patglobflags = savpatglobflags;
     unqueue_signals();
     return p;
 }
@@ -2259,6 +2268,9 @@ pattryrefs(Patprog prog, char *string, int stringlen, int unmetalenin,
     char *progstr = (char *)prog + prog->startoff;
     struct patstralloc patstralloc_struct;
 
+    /* In case called from a signal handler */
+    int savpatflags = patflags, savpatglobflags = patglobflags;
+
     if (nump) {
 	maxnpos = *nump;
 	*nump = 0;
@@ -2302,7 +2314,7 @@ pattryrefs(Patprog prog, char *string, int stringlen, int unmetalenin,
 	 * Either we are testing against a pure string,
 	 * or we can match anything at all.
 	 */
-	int ret, pstrlen;
+	int pstrlen;
 	char *pstr;
 	if (patstralloc->alloced)
 	{
@@ -2404,8 +2416,6 @@ pattryrefs(Patprog prog, char *string, int stringlen, int unmetalenin,
 		}
 	    }
 	}
-
-	return ret;
     } else {
 	int q = queue_signal_level();
 
@@ -2441,6 +2451,8 @@ pattryrefs(Patprog prog, char *string, int stringlen, int unmetalenin,
 	    }
 	}
 	if (!ret) {
+	    patflags = savpatflags;
+	    patglobflags = savpatglobflags;
 	    return 0;
 	}
 
@@ -2596,9 +2608,11 @@ pattryrefs(Patprog prog, char *string, int stringlen, int unmetalenin,
 	    ret = 0;
 
 	restore_queue_signals(q);
-
-	return ret;
     }
+
+    patflags = savpatflags;
+    patglobflags = savpatglobflags;
+    return ret;
 }
 
 /*

