aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2018-07-31 09:07:29 +0300
committerArnold D. Robbins <arnold@skeeve.com>2018-07-31 09:07:29 +0300
commitf856979d85ace61bfeb2d31146485ec668202ad8 (patch)
tree754f2101557d620a56b66e23209909f790b0cb09
parent4703b75c618070d88f9e2eff084ca8119980bd9c (diff)
downloadegawk-f856979d85ace61bfeb2d31146485ec668202ad8.tar.gz
egawk-f856979d85ace61bfeb2d31146485ec668202ad8.tar.bz2
egawk-f856979d85ace61bfeb2d31146485ec668202ad8.zip
Fix coredump from IGNORECASE array sorting.
-rw-r--r--ChangeLog6
-rw-r--r--array.c9
-rw-r--r--test/ChangeLog5
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.in9
-rw-r--r--test/Maketests5
-rw-r--r--test/arraysort2.awk34
-rw-r--r--test/arraysort2.ok26
8 files changed, 93 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index d3d099bd..ba471617 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-31 Arnold D. Robbins <arnold@skeeve.com>
+
+ * array.c (cmp_strings): Preserve value of lmin so it can be passed
+ to memcmp() if IGNORECASE comparison failed. Thanks to
+ M. Rashid Zamani <rashid.z@gmail.com> for the report.
+
2018-07-27 Arnold D. Robbins <arnold@skeeve.com>
* re.c (make_regexp): Add warnings for unknown escape sequences,
diff --git a/array.c b/array.c
index 5d953c04..aa52f3a1 100644
--- a/array.c
+++ b/array.c
@@ -979,7 +979,6 @@ cmp_strings(const NODE *n1, const NODE *n2)
char *s1, *s2;
size_t len1, len2;
int ret;
- size_t lmin;
s1 = n1->stptr;
len1 = n1->stlen;
@@ -992,7 +991,9 @@ cmp_strings(const NODE *n1, const NODE *n2)
return 1;
/* len1 > 0 && len2 > 0 */
- lmin = len1 < len2 ? len1 : len2;
+ // make const to ensure it doesn't change if we
+ // need to call memcmp(), below
+ const size_t lmin = len1 < len2 ? len1 : len2;
if (IGNORECASE) {
const unsigned char *cp1 = (const unsigned char *) s1;
@@ -1002,7 +1003,9 @@ cmp_strings(const NODE *n1, const NODE *n2)
ret = strncasecmpmbs((const unsigned char *) cp1,
(const unsigned char *) cp2, lmin);
} else {
- for (ret = 0; lmin-- > 0 && ret == 0; cp1++, cp2++)
+ size_t count = lmin;
+
+ for (ret = 0; count-- > 0 && ret == 0; cp1++, cp2++)
ret = casetable[*cp1] - casetable[*cp2];
}
if (ret != 0)
diff --git a/test/ChangeLog b/test/ChangeLog
index 6e7e3e01..392d593b 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-31 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (EXTRA_DIST): Add arraysort2 files.
+ * arraysort2.awk, arraysort2.ok: New files.
+
2018-07-27 Arnold D. Robbins <arnold@skeeve.com>
* back89.ok, funstack.ok, gsubtst5.ok: Update after code changes.
diff --git a/test/Makefile.am b/test/Makefile.am
index 4ab96409..e6f1e223 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -74,6 +74,8 @@ EXTRA_DIST = \
arrayref.ok \
arraysort.awk \
arraysort.ok \
+ arraysort2.awk \
+ arraysort2.ok \
arrdbg.awk \
arrymem1.awk \
arrymem1.ok \
@@ -1275,7 +1277,7 @@ UNIX_TESTS = \
space strftlng
GAWK_EXT_TESTS = \
- aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \
+ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort arraysort2 \
backw badargs beginfile1 beginfile2 binmode1 \
charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
clos1way6 crlf \
diff --git a/test/Makefile.in b/test/Makefile.in
index 5b34a5ad..532aca07 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -332,6 +332,8 @@ EXTRA_DIST = \
arrayref.ok \
arraysort.awk \
arraysort.ok \
+ arraysort2.awk \
+ arraysort2.ok \
arrdbg.awk \
arrymem1.awk \
arrymem1.ok \
@@ -1533,7 +1535,7 @@ UNIX_TESTS = \
space strftlng
GAWK_EXT_TESTS = \
- aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort \
+ aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort arraysort2 \
backw badargs beginfile1 beginfile2 binmode1 \
charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
clos1way6 crlf \
@@ -3904,6 +3906,11 @@ arraysort:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+arraysort2:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
backw:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/Maketests b/test/Maketests
index 5e5fa5ee..8c604222 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -1259,6 +1259,11 @@ arraysort:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+arraysort2:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
backw:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/test/arraysort2.awk b/test/arraysort2.awk
new file mode 100644
index 00000000..e52d2a7c
--- /dev/null
+++ b/test/arraysort2.awk
@@ -0,0 +1,34 @@
+# This should no longer core dump ... 7/31/2018
+function init(b, a, i)
+{
+ a[1] = "aardvark"
+ a[2] = "animal"
+ a[3] = "zebra"
+ a[4] = "zoo"
+ a[5] = "Iguana"
+ a[6] = "Alligator"
+ a[7] =a[8] = "people"
+ for (i in a)
+ b[IGNORECASE][i] = a[i]
+}
+
+BEGIN {
+
+ for (IGNORECASE = 0; IGNORECASE < 2; IGNORECASE++) {
+ init(b)
+
+ n = asort(b[IGNORECASE])
+
+ for (i = 1; i <= n; i++)
+ printf("b[%d][%d] = \"%s\"\n", IGNORECASE, i, b[IGi])
+
+ print "===="
+ }
+
+ IGNORECASE = 1
+ init(b)
+ b[2][1] = ""
+ n = asort(b[1], b[2])
+ for (i = 1; i <= n; i++)
+ printf("b[2][%d] = \"%s\"\n", i, b[2][i])
+}
diff --git a/test/arraysort2.ok b/test/arraysort2.ok
new file mode 100644
index 00000000..8fda0bfd
--- /dev/null
+++ b/test/arraysort2.ok
@@ -0,0 +1,26 @@
+b[0][1] = ""
+b[0][2] = ""
+b[0][3] = ""
+b[0][4] = ""
+b[0][5] = ""
+b[0][6] = ""
+b[0][7] = ""
+b[0][8] = ""
+====
+b[1][1] = ""
+b[1][2] = ""
+b[1][3] = ""
+b[1][4] = ""
+b[1][5] = ""
+b[1][6] = ""
+b[1][7] = ""
+b[1][8] = ""
+====
+b[2][1] = "aardvark"
+b[2][2] = "Alligator"
+b[2][3] = "animal"
+b[2][4] = "Iguana"
+b[2][5] = "people"
+b[2][6] = "people"
+b[2][7] = "zebra"
+b[2][8] = "zoo"