git: 6f567e62fac5 - main - shells/ksh*: Fix ksh 1.0.5 Regression (issue #660) version 2

From: Cy Schubert <cy_at_FreeBSD.org>
Date: Tue, 13 Jun 2023 02:37:55 UTC
The branch main has been updated by cy:

URL: https://cgit.FreeBSD.org/ports/commit/?id=6f567e62fac522bf3005a01e23b4fdec9e4dc725

commit 6f567e62fac522bf3005a01e23b4fdec9e4dc725
Author:     Cy Schubert <cy@FreeBSD.org>
AuthorDate: 2023-06-13 02:34:57 +0000
Commit:     Cy Schubert <cy@FreeBSD.org>
CommitDate: 2023-06-13 02:37:49 +0000

    shells/ksh*: Fix ksh 1.0.5 Regression (issue #660) version 2
    
    From the upstream patch description:
    
    Patch version two. In mac_copy(), don't internally backslash-escape
    a backslash in a glob pattern bracket expression. This also fixes
    the #549 regression reintroduced by the previous patch, at least for
    standard glob patterns. For this, we need to use the bracketexpr flag
    (introduced as a copyto() local variable in 6c73c8c) in mac_copy(),
    so we move it to the Mac_t struct, making it globally accessible.
    Initialisation is automatic.
---
 shells/ksh-devel/Makefile                          |  1 +
 .../ksh-devel/files/patch-src_cmd_ksh93_sh_macro.c | 81 ++++++++++++++++++++--
 shells/ksh/Makefile                                |  2 +-
 shells/ksh/files/patch-src_cmd_ksh93_sh_macro.c    | 81 ++++++++++++++++++++--
 4 files changed, 154 insertions(+), 11 deletions(-)

diff --git a/shells/ksh-devel/Makefile b/shells/ksh-devel/Makefile
index 50ec6bbbd593..90300f060f96 100644
--- a/shells/ksh-devel/Makefile
+++ b/shells/ksh-devel/Makefile
@@ -10,6 +10,7 @@
 
 PORTNAME=	ksh
 PORTVERSION=	${AST_COMMIT_DATE}
+PORTREVISION=	1
 CATEGORIES=	shells
 PKGNAMESUFFIX=	-devel
 
diff --git a/shells/ksh-devel/files/patch-src_cmd_ksh93_sh_macro.c b/shells/ksh-devel/files/patch-src_cmd_ksh93_sh_macro.c
index 391cff245ac6..a3b6a4f2585e 100644
--- a/shells/ksh-devel/files/patch-src_cmd_ksh93_sh_macro.c
+++ b/shells/ksh-devel/files/patch-src_cmd_ksh93_sh_macro.c
@@ -1,8 +1,79 @@
-diff --git src/cmd/ksh93/sh/macro.c.orig src/cmd/ksh93/sh/macro.c
-index aba6f9d..0d60219 100644
---- src/cmd/ksh93/sh/macro.c.orig
-+++ src/cmd/ksh93/sh/macro.c
-@@ -2582,7 +2582,7 @@ static void endfield(Mac_t *mp,int split)
+--- src/cmd/ksh93/sh/macro.c.orig	2023-06-08 23:30:08.000000000 -0700
++++ src/cmd/ksh93/sh/macro.c	2023-06-12 19:26:31.718942000 -0700
+@@ -76,6 +76,7 @@
+ 	char		macsub;		/* set to 1 when running mac_substitute */
+ 	int		dotdot;		/* set for .. in subscript */
+ 	void		*nvwalk;	/* for name space walking */
++	char		bracketexpr; 	/* set when in [brackets] within a non-ERE glob pattern */
+ } Mac_t;
+ 
+ #undef ESCAPE
+@@ -437,7 +438,6 @@
+ 	char		oldquote = mp->quote;	/* save "double quoted" state */
+ 	char		ansi_c = 0;		/* set when processing ANSI C escape codes */
+ 	int32_t		ere = 0;		/* bitmask of pattern options indicating an extended regular expression */
+-	char		bracketexpr = 0; 	/* set when in [brackets] within a non-ERE glob pattern */
+ 	Sfio_t		*sp = mp->sp;
+ 	Stk_t		*stkp = sh.stk;
+ 	char		*resume = 0;
+@@ -533,7 +533,7 @@
+ 			if(mp->pattern)
+ 			{
+ 				/* preserve \ for escaping glob pattern bracket expression operators */
+-				if(bracketexpr && n==S_BRAOP)
++				if(mp->bracketexpr && n==S_BRAOP)
+ 					break;
+ 				/* preserve \digit for pattern matching */
+ 				/* also \alpha for extended patterns */
+@@ -636,8 +636,8 @@
+ 				mp->pattern = c;
+ 			break;
+ 		    case S_ENDCH:
+-			if(bracketexpr && cp[-1]==RBRACT && !(mp->quote || mp->lit))
+-				bracketexpr--;
++			if(mp->bracketexpr && cp[-1]==RBRACT && !(mp->quote || mp->lit))
++				mp->bracketexpr--;
+ 			if((mp->lit || cp[-1]!=endch || mp->quote!=newquote))
+ 				goto pattern;
+ 			if(endch==RBRACE && mp->pattern && brace)
+@@ -738,12 +738,12 @@
+ 				cp = first = fcseek(0);
+ 				break;
+ 			}
+-			if(mp->pattern==1 && !ere && !bracketexpr)
++			if(mp->pattern==1 && !ere && !mp->bracketexpr)
+ 			{
+-				bracketexpr++;
++				mp->bracketexpr++;
+ 				/* a ] following [, as in []abc], should not close the bracket expression */
+ 				if(cp[0]==RBRACT && cp[1])
+-					bracketexpr++;
++					mp->bracketexpr++;
+ 			}
+ 			/* FALLTHROUGH */
+ 		    case S_PAT:
+@@ -883,7 +883,7 @@
+ 			break;
+ 		    case S_BRAOP:
+ 			/* escape a quoted !^- within a bracket expression */
+-			if(!bracketexpr || !(mp->quote || mp->lit))
++			if(!mp->bracketexpr || !(mp->quote || mp->lit))
+ 				continue;
+ 			if(c)
+ 				sfwrite(stkp,first,c);
+@@ -2481,7 +2481,10 @@
+ 				continue;
+ 			}
+ 			if(n==S_ESC)
+-				sfputc(stkp,ESCAPE);
++			{
++				if(!mp->bracketexpr)
++					sfputc(stkp,ESCAPE);
++			}
+ 			else if(n==S_EPAT)
+ 			{
+ 				/* don't allow extended patterns in this case */
+@@ -2583,7 +2586,7 @@
  		mp->atmode = 0;
  		if(mp->patfound)
  		{
diff --git a/shells/ksh/Makefile b/shells/ksh/Makefile
index 319bdab02d59..f111d24d6fd5 100644
--- a/shells/ksh/Makefile
+++ b/shells/ksh/Makefile
@@ -11,7 +11,7 @@
 DISTVERSIONPREFIX=	v
 PORTNAME=	ksh
 PORTVERSION=	1.0.5
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	shells
 
 MAINTAINER=	cy@FreeBSD.org
diff --git a/shells/ksh/files/patch-src_cmd_ksh93_sh_macro.c b/shells/ksh/files/patch-src_cmd_ksh93_sh_macro.c
index 391cff245ac6..30ba02d5304d 100644
--- a/shells/ksh/files/patch-src_cmd_ksh93_sh_macro.c
+++ b/shells/ksh/files/patch-src_cmd_ksh93_sh_macro.c
@@ -1,8 +1,79 @@
-diff --git src/cmd/ksh93/sh/macro.c.orig src/cmd/ksh93/sh/macro.c
-index aba6f9d..0d60219 100644
---- src/cmd/ksh93/sh/macro.c.orig
-+++ src/cmd/ksh93/sh/macro.c
-@@ -2582,7 +2582,7 @@ static void endfield(Mac_t *mp,int split)
+--- src/cmd/ksh93/sh/macro.c.orig	2023-06-06 21:29:33.000000000 -0700
++++ src/cmd/ksh93/sh/macro.c	2023-06-12 19:23:44.427794000 -0700
+@@ -76,6 +76,7 @@
+ 	char		macsub;		/* set to 1 when running mac_substitute */
+ 	int		dotdot;		/* set for .. in subscript */
+ 	void		*nvwalk;	/* for name space walking */
++	char		bracketexpr; 	/* set when in [brackets] within a non-ERE glob pattern */
+ } Mac_t;
+ 
+ #undef ESCAPE
+@@ -437,7 +438,6 @@
+ 	char		oldquote = mp->quote;	/* save "double quoted" state */
+ 	char		ansi_c = 0;		/* set when processing ANSI C escape codes */
+ 	int32_t		ere = 0;		/* bitmask of pattern options indicating an extended regular expression */
+-	char		bracketexpr = 0; 	/* set when in [brackets] within a non-ERE glob pattern */
+ 	Sfio_t		*sp = mp->sp;
+ 	Stk_t		*stkp = sh.stk;
+ 	char		*resume = 0;
+@@ -533,7 +533,7 @@
+ 			if(mp->pattern)
+ 			{
+ 				/* preserve \ for escaping glob pattern bracket expression operators */
+-				if(bracketexpr && n==S_BRAOP)
++				if(mp->bracketexpr && n==S_BRAOP)
+ 					break;
+ 				/* preserve \digit for pattern matching */
+ 				/* also \alpha for extended patterns */
+@@ -636,8 +636,8 @@
+ 				mp->pattern = c;
+ 			break;
+ 		    case S_ENDCH:
+-			if(bracketexpr && cp[-1]==RBRACT && !(mp->quote || mp->lit))
+-				bracketexpr--;
++			if(mp->bracketexpr && cp[-1]==RBRACT && !(mp->quote || mp->lit))
++				mp->bracketexpr--;
+ 			if((mp->lit || cp[-1]!=endch || mp->quote!=newquote))
+ 				goto pattern;
+ 			if(endch==RBRACE && mp->pattern && brace)
+@@ -738,12 +738,12 @@
+ 				cp = first = fcseek(0);
+ 				break;
+ 			}
+-			if(mp->pattern==1 && !ere && !bracketexpr)
++			if(mp->pattern==1 && !ere && !mp->bracketexpr)
+ 			{
+-				bracketexpr++;
++				mp->bracketexpr++;
+ 				/* a ] following [, as in []abc], should not close the bracket expression */
+ 				if(cp[0]==RBRACT && cp[1])
+-					bracketexpr++;
++					mp->bracketexpr++;
+ 			}
+ 			/* FALLTHROUGH */
+ 		    case S_PAT:
+@@ -883,7 +883,7 @@
+ 			break;
+ 		    case S_BRAOP:
+ 			/* escape a quoted !^- within a bracket expression */
+-			if(!bracketexpr || !(mp->quote || mp->lit))
++			if(!mp->bracketexpr || !(mp->quote || mp->lit))
+ 				continue;
+ 			if(c)
+ 				sfwrite(stkp,first,c);
+@@ -2481,7 +2481,10 @@
+ 				continue;
+ 			}
+ 			if(n==S_ESC)
+-				sfputc(stkp,ESCAPE);
++			{
++				if(!mp->bracketexpr)
++					sfputc(stkp,ESCAPE);
++			}
+ 			else if(n==S_EPAT)
+ 			{
+ 				/* don't allow extended patterns in this case */
+@@ -2582,7 +2585,7 @@
  		mp->atmode = 0;
  		if(mp->patfound)
  		{