https://bugs.gentoo.org/921503
https://lists.gnu.org/archive/html/bug-gawk/2024-01/msg00013.html
https://git.savannah.gnu.org/cgit/gawk.git/commit/?h=gawk-5.3-stable&id=e05040b5d81b5a0e809fc56df2a7c3d654c77e1d

From e05040b5d81b5a0e809fc56df2a7c3d654c77e1d Mon Sep 17 00:00:00 2001
From: "Arnold D. Robbins" <arnold@skeeve.com>
Date: Sun, 28 Jan 2024 20:24:09 +0200
Subject: Bug fix in str2wstr.

---
 node.c           | 26 ++++++++++++++------------
 pc/Makefile.tst  |  6 ++++++
 test/Makefile.am |  5 ++++-
 test/Makefile.in | 10 +++++++++-
 test/Maketests   |  5 +++++
 test/match4.awk  |  1 +
 test/match4.ok   |  1 +
 10 files changed, 56 insertions(+), 14 deletions(-)
 create mode 100644 test/match4.awk
 create mode 100644 test/match4.ok

diff --git a/node.c b/node.c
index de12f05..5aac5e8 100644
--- a/node.c
+++ b/node.c
@@ -816,6 +816,20 @@ str2wstr(NODE *n, size_t **ptr)
 	assert((n->flags & (STRING|STRCUR)) != 0);
 
 	/*
+	 * For use by do_match, create and fill in an array.
+	 * For each byte `i' in n->stptr (the original string),
+	 * a[i] is equal to `j', where `j' is the corresponding wchar_t
+	 * in the converted wide string.
+	 *
+	 * This is needed even for Nnull_string or Null_field.
+	 *
+	 * Create the array.
+	 */
+	if (ptr != NULL) {
+		ezalloc(*ptr, size_t *, sizeof(size_t) * (n->stlen + 1), "str2wstr");
+	}
+
+	/*
 	 * Don't convert global null string or global null field
 	 * variables to a wide string. They are both zero-length anyway.
 	 * This also avoids future double-free errors while releasing
@@ -848,18 +862,6 @@ str2wstr(NODE *n, size_t **ptr)
 	emalloc(n->wstptr, wchar_t *, sizeof(wchar_t) * (n->stlen + 1), "str2wstr");
 	wsp = n->wstptr;
 
-	/*
-	 * For use by do_match, create and fill in an array.
-	 * For each byte `i' in n->stptr (the original string),
-	 * a[i] is equal to `j', where `j' is the corresponding wchar_t
-	 * in the converted wide string.
-	 *
-	 * Create the array.
-	 */
-	if (ptr != NULL) {
-		ezalloc(*ptr, size_t *, sizeof(size_t) * (n->stlen + 1), "str2wstr");
-	}
-
 	sp = n->stptr;
 	src_count = n->stlen;
 	memset(& mbs, 0, sizeof(mbs));
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index daf3c56..9ab61c7 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -180,6 +180,7 @@ BASIC_TESTS = \
 	substr swaplns synerr1 synerr2 synerr3 tailrecurse tradanch \
 	trailbs tweakfld uninit2 uninit3 uninit4 uninit5 uninitialized \
 	unterm uparrfs uplus wideidx wideidx2 widesub widesub2 widesub3 \
+	match4 \
 	widesub4 wjposer1 zero2 zeroe0 zeroflag
 
 UNIX_TESTS = \
@@ -2602,6 +2603,11 @@ widesub3:
 	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
 	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
 
+match4:
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
 widesub4:
 	@echo $@ $(ZOS_FAIL)
 	@-[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
diff --git a/test/Makefile.am b/test/Makefile.am
index a876b3a..e1e1f3f 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,7 +1,7 @@
 #
 # test/Makefile.am --- automake input file for gawk
 #
-# Copyright (C) 1988-2023 the Free Software Foundation, Inc.
+# Copyright (C) 1988-2024 the Free Software Foundation, Inc.
 #
 # This file is part of GAWK, the GNU implementation of the
 # AWK Programming Language.
@@ -763,6 +763,8 @@ EXTRA_DIST = \
 	match3.awk \
 	match3.in \
 	match3.ok \
+	match4.awk \
+	match4.ok \
 	math.awk \
 	math.ok \
 	mbfw1.awk \
@@ -1544,6 +1546,7 @@ BASIC_TESTS = \
 	substr swaplns synerr1 synerr2 synerr3 tailrecurse tradanch \
 	trailbs tweakfld uninit2 uninit3 uninit4 uninit5 uninitialized \
 	unterm uparrfs uplus wideidx wideidx2 widesub widesub2 widesub3 \
+	match4 \
 	widesub4 wjposer1 zero2 zeroe0 zeroflag
 
 UNIX_TESTS = \
diff --git a/test/Makefile.in b/test/Makefile.in
index 1ef143f..681a85b 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -17,7 +17,7 @@
 #
 # test/Makefile.am --- automake input file for gawk
 #
-# Copyright (C) 1988-2023 the Free Software Foundation, Inc.
+# Copyright (C) 1988-2024 the Free Software Foundation, Inc.
 #
 # This file is part of GAWK, the GNU implementation of the
 # AWK Programming Language.
@@ -1027,6 +1027,8 @@ EXTRA_DIST = \
 	match3.awk \
 	match3.in \
 	match3.ok \
+	match4.awk \
+	match4.ok \
 	math.awk \
 	math.ok \
 	mbfw1.awk \
@@ -1808,6 +1810,7 @@ BASIC_TESTS = \
 	substr swaplns synerr1 synerr2 synerr3 tailrecurse tradanch \
 	trailbs tweakfld uninit2 uninit3 uninit4 uninit5 uninitialized \
 	unterm uparrfs uplus wideidx wideidx2 widesub widesub2 widesub3 \
+	match4 \
 	widesub4 wjposer1 zero2 zeroe0 zeroflag
 
 UNIX_TESTS = \
@@ -4414,6 +4417,11 @@ widesub3:
 	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
 	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
 
+match4:
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
 widesub4:
 	@echo $@ $(ZOS_FAIL)
 	@-[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
diff --git a/test/Maketests b/test/Maketests
index bac220f..9a00140 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1288,6 +1288,11 @@ widesub3:
 	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
 	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
 
+match4:
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
 widesub4:
 	@echo $@ $(ZOS_FAIL)
 	@-[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
diff --git a/test/match4.awk b/test/match4.awk
new file mode 100644
index 0000000..e50150a
--- /dev/null
+++ b/test/match4.awk
@@ -0,0 +1 @@
+BEGIN { print match (m, /a?/) }
diff --git a/test/match4.ok b/test/match4.ok
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/test/match4.ok
@@ -0,0 +1 @@
+1
-- 
cgit v1.1
