summaryrefslogtreecommitdiff
blob: 078ba8b1c7466e9e4c713cef30b865504e69a2ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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