diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2016-06-01 11:38:52 -0400 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2016-06-01 11:38:52 -0400 |
commit | 9867841a4767347cd89c9fd0127db3c7eaf943e6 (patch) | |
tree | 4b01081a570ea6666823b54ef912630f1e3cdfe8 | |
parent | 88c6afdf1c83a7ea51225fbb173d910533c51bb0 (diff) | |
download | egawk-9867841a4767347cd89c9fd0127db3c7eaf943e6.tar.gz egawk-9867841a4767347cd89c9fd0127db3c7eaf943e6.tar.bz2 egawk-9867841a4767347cd89c9fd0127db3c7eaf943e6.zip |
Disallow negative hex numbers in input data.
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | node.c | 17 | ||||
-rw-r--r-- | test/ChangeLog | 5 | ||||
-rw-r--r-- | test/Makefile.am | 5 | ||||
-rw-r--r-- | test/Makefile.in | 10 | ||||
-rw-r--r-- | test/Maketests | 5 | ||||
-rw-r--r-- | test/hex2.awk | 1 | ||||
-rw-r--r-- | test/hex2.in | 2 | ||||
-rw-r--r-- | test/hex2.ok | 2 |
9 files changed, 46 insertions, 4 deletions
@@ -3,6 +3,9 @@ * nonposix.h (getpgrp): Wrap declaration in ifdef so it doesn't mess things up on POSIX systems (like Solaris). Thanks to Nelson Beebe for the report. + * node.c (is_hex): New function to check for 0x preceded by + optional sign. + (r_force_number): Use it. Thanks to Mike Brennan for the report. 2016-05-30 Arnold D. Robbins <arnold@skeeve.com> @@ -38,6 +38,20 @@ NODE *(*str2number)(NODE *) = r_force_number; NODE *(*format_val)(const char *, int, NODE *) = r_format_val; int (*cmp_numbers)(const NODE *, const NODE *) = cmp_awknums; +/* is_hex --- return true if a string looks like a hex value */ + +static bool +is_hex(const char *str) +{ + if (*str == '-' || *str == '+') + str++; + + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) + return true; + + return false; +} + /* force_number --- force a value to be numeric */ NODE * @@ -96,8 +110,7 @@ r_force_number(NODE *n) || (! do_posix /* not POSIXLY paranoid and */ && (is_alpha((unsigned char) *cp) /* letter, or */ /* CANNOT do non-decimal and saw 0x */ - || (! do_non_decimal_data && cp[0] == '0' - && (cp[1] == 'x' || cp[1] == 'X'))))) { + || (! do_non_decimal_data && is_hex(cp))))) { return n; } diff --git a/test/ChangeLog b/test/ChangeLog index 2e1090ce..02f083d6 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,8 @@ +2016-06-01 Arnold D. Robbins <arnold@skeeve.com> + + * Makefile.am (hex2): New test. + * hex2.awk, hex2.in, hex2.ok: New files. + 2016-05-30 Arnold D. Robbins <arnold@skeeve.com> * Makefile.am (fsnul1): New test. diff --git a/test/Makefile.am b/test/Makefile.am index 92e8f6e7..7cd37fdd 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -420,6 +420,9 @@ EXTRA_DIST = \ hello.awk \ hex.awk \ hex.ok \ + hex2.awk \ + hex2.in \ + hex2.ok \ hsprint.awk \ hsprint.ok \ icasefs.awk \ @@ -1064,7 +1067,7 @@ BASIC_TESTS = \ getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \ gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 \ gsubtst7 gsubtst8 \ - hex hsprint \ + hex hex2 hsprint \ inpref inputred intest intprec iobug1 \ leaddig leadnl litoct longsub longwrds \ manglprm math membug1 messages minusstr mmap8k mtchi18n \ diff --git a/test/Makefile.in b/test/Makefile.in index 34656eca..23f50afc 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -677,6 +677,9 @@ EXTRA_DIST = \ hello.awk \ hex.awk \ hex.ok \ + hex2.awk \ + hex2.in \ + hex2.ok \ hsprint.awk \ hsprint.ok \ icasefs.awk \ @@ -1320,7 +1323,7 @@ BASIC_TESTS = \ getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \ gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 \ gsubtst7 gsubtst8 \ - hex hsprint \ + hex hex2 hsprint \ inpref inputred intest intprec iobug1 \ leaddig leadnl litoct longsub longwrds \ manglprm math membug1 messages minusstr mmap8k mtchi18n \ @@ -3011,6 +3014,11 @@ hex: @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +hex2: + @echo $@ + @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + hsprint: @echo $@ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/Maketests b/test/Maketests index e5bde1d2..c7b125c7 100644 --- a/test/Maketests +++ b/test/Maketests @@ -415,6 +415,11 @@ hex: @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ +hex2: + @echo $@ + @AWKPATH="$(srcdir)" $(AWK) -f $@.awk < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ + hsprint: @echo $@ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ diff --git a/test/hex2.awk b/test/hex2.awk new file mode 100644 index 00000000..49c6203d --- /dev/null +++ b/test/hex2.awk @@ -0,0 +1 @@ +{ print $1 + 7} diff --git a/test/hex2.in b/test/hex2.in new file mode 100644 index 00000000..60f06f0f --- /dev/null +++ b/test/hex2.in @@ -0,0 +1,2 @@ +0x4 +-0x4 diff --git a/test/hex2.ok b/test/hex2.ok new file mode 100644 index 00000000..49019db8 --- /dev/null +++ b/test/hex2.ok @@ -0,0 +1,2 @@ +7 +7 |