diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2018-07-31 09:07:29 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2018-07-31 09:07:29 +0300 |
commit | f856979d85ace61bfeb2d31146485ec668202ad8 (patch) | |
tree | 754f2101557d620a56b66e23209909f790b0cb09 | |
parent | 4703b75c618070d88f9e2eff084ca8119980bd9c (diff) | |
download | egawk-f856979d85ace61bfeb2d31146485ec668202ad8.tar.gz egawk-f856979d85ace61bfeb2d31146485ec668202ad8.tar.bz2 egawk-f856979d85ace61bfeb2d31146485ec668202ad8.zip |
Fix coredump from IGNORECASE array sorting.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | array.c | 9 | ||||
-rw-r--r-- | test/ChangeLog | 5 | ||||
-rw-r--r-- | test/Makefile.am | 4 | ||||
-rw-r--r-- | test/Makefile.in | 9 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/arraysort2.awk | 34 | ||||
-rw-r--r-- | test/arraysort2.ok | 26 |
8 files changed, 93 insertions, 5 deletions
@@ -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, @@ -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" |