diff options
author | Tobias Stoeckmann <tobias@cvs.openbsd.org> | 2018-03-30 09:25:07 +0000 |
---|---|---|
committer | Tobias Stoeckmann <tobias@cvs.openbsd.org> | 2018-03-30 09:25:07 +0000 |
commit | 187692fc65df0f68e4089df7578f3ad930aeaf24 (patch) | |
tree | 7214fb735580f4df7531a5b6b165ffe607ebdf09 /regress | |
parent | 1b19d9614f9191be3c3ec524f1e2d30dd2abfa65 (diff) |
Fix overflow in list value parsing.
On 64 bit systems an integer overflow between strtol and int casting
could occur, resulting in out of boundary writes. Using strtonum fixes
this issue and leads to better error messages.
ok schwarze
Diffstat (limited to 'regress')
-rw-r--r-- | regress/usr.bin/cut/cut.sh | 94 |
1 files changed, 60 insertions, 34 deletions
diff --git a/regress/usr.bin/cut/cut.sh b/regress/usr.bin/cut/cut.sh index e9e6369847c..19d1b29174f 100644 --- a/regress/usr.bin/cut/cut.sh +++ b/regress/usr.bin/cut/cut.sh @@ -16,15 +16,26 @@ unset LC_ALL +: ${CUT=cut} + test_cut() { - args=`echo "$1"` - stdin=$2 - expected=`echo "$3"` + expected_retval=$1 + args=`echo "$2"` + stdin=$3 + expected=`echo "$4"` export LC_CTYPE=en_US.UTF-8 - result=`echo -n "$stdin" | cut $args` + result=`echo -n "$stdin" | $CUT $args 2>/dev/null` + retval=$? + if [ "$retval" -ne "${expected_retval}" ]; then + echo "echo -n \"$stdin\" | $CUT $args" + echo -n "$stdin" | hexdump -C + echo "expected return value: \"${expected_retval}\"" + echo "actual return value: \"$retval\"" + exit 1; + fi if [ "$result" != "${expected}" ]; then - echo "echo -n \"$stdin\" | cut $args" + echo "echo -n \"$stdin\" | $CUT $args" echo -n "$stdin" | hexdump -C echo "expected: \"$expected\"" echo -n "$expected" | hexdump -C @@ -33,13 +44,20 @@ test_cut() exit 1; fi - if [ -n "$4" ]; then - expected=`echo "$4"` + if [ -n "$5" ]; then + expected=`echo "$5"` fi export LC_CTYPE=C - result=`echo -n "$stdin" | cut $args` + result=`echo -n "$stdin" | $CUT $args 2>/dev/null` + if [ "$retval" -ne "${expected_retval}" ]; then + echo "echo -n \"$stdin\" | $CUT $args" + echo -n "$stdin" | hexdump -C + echo "expected return value: \"${expected_retval}\"" + echo "actual return value: \"$retval\"" + exit 1; + fi if [ "$result" != "${expected}" ]; then - echo "[C] echo -n \"$stdin\" | cut $args" + echo "[C] echo -n \"$stdin\" | $CUT $args" echo -n "$stdin" | hexdump -C echo "expected: \"$expected\"" echo -n "$expected" | hexdump -C @@ -50,41 +68,49 @@ test_cut() } # single byte characters -test_cut "-b 4,2" "abcde" "bd" -test_cut "-b 2-4" "abcde" "bcd" -test_cut "-b 4-,-2" "abcde" "abde" -test_cut "-nb 4,2" "abcde" "bd" -test_cut "-nb 2-4" "abcde" "bcd" -test_cut "-nb 4-,-2" "abcde" "abde" -test_cut "-c 4,2" "abcde" "bd" -test_cut "-c 2-4" "abcde" "bcd" -test_cut "-c 4-,-2" "abcde" "abde" +test_cut 0 "-b 4,2" "abcde" "bd" +test_cut 0 "-b 2-4" "abcde" "bcd" +test_cut 0 "-b 4-,-2" "abcde" "abde" +test_cut 0 "-nb 4,2" "abcde" "bd" +test_cut 0 "-nb 2-4" "abcde" "bcd" +test_cut 0 "-nb 4-,-2" "abcde" "abde" +test_cut 0 "-c 4,2" "abcde" "bd" +test_cut 0 "-c 2-4" "abcde" "bcd" +test_cut 0 "-c 4-,-2" "abcde" "abde" # multibyte characters -test_cut "-b 2-3" "ax\0314\0200b" "x\0314" -test_cut "-b 1,3" "ax\0314\0200b" "a\0314" -test_cut "-nb 2-3" "ax\0314\0200b" "x" "x\0314" -test_cut "-nb 1,3" "ax\0314\0200b" "a" "a\0314" -test_cut "-nb 2,4" "ax\0314\0200b" "x\0314\0200" "x\0200" -test_cut "-c 2-3" "ax\0314\0200b" "x\0314\0200" "x\0314" -test_cut "-c 1,3" "ax\0314\0200b" "a\0314\0200" "a\0314" +test_cut 0 "-b 2-3" "ax\0314\0200b" "x\0314" +test_cut 0 "-b 1,3" "ax\0314\0200b" "a\0314" +test_cut 0 "-nb 2-3" "ax\0314\0200b" "x" "x\0314" +test_cut 0 "-nb 1,3" "ax\0314\0200b" "a" "a\0314" +test_cut 0 "-nb 2,4" "ax\0314\0200b" "x\0314\0200" "x\0200" +test_cut 0 "-c 2-3" "ax\0314\0200b" "x\0314\0200" "x\0314" +test_cut 0 "-c 1,3" "ax\0314\0200b" "a\0314\0200" "a\0314" # double width multibyte characters -test_cut "-b -3" "a\0354\0277\0277b" "a\0354\0277" -test_cut "-nb 4-" "a\0354\0277\0277b" "\0354\0277\0277b" "\0277b" -test_cut "-c 2" "a\0354\0277\0277b" "\0354\0277\0277" "\0354" +test_cut 0 "-b -3" "a\0354\0277\0277b" "a\0354\0277" +test_cut 0 "-nb 4-" "a\0354\0277\0277b" "\0354\0277\0277b" "\0277b" +test_cut 0 "-c 2" "a\0354\0277\0277b" "\0354\0277\0277" "\0354" # invalid bytes -test_cut "-b -2" "a\0377\0277b" "a\0377" -test_cut "-b 3-" "a\0377\0277b" "\0277b" -test_cut "-nb 2-5" "\0303\0251\0377\0277\0303\0251" "\0303\0251\0377\0277" \ +test_cut 0 "-b -2" "a\0377\0277b" "a\0377" +test_cut 0 "-b 3-" "a\0377\0277b" "\0277b" +test_cut 0 "-nb 2-5" "\0303\0251\0377\0277\0303\0251" "\0303\0251\0377\0277" \ "\0251\0377\0277\0303" -test_cut "-c 4,1" "\0303\0251\0377\0277\0303\0250" "\0303\0251\0303\0250" \ +test_cut 0 "-c 4,1" "\0303\0251\0377\0277\0303\0250" "\0303\0251\0303\0250" \ "\0303\0277" # multibyte delimiter -test_cut "-d \0302\0267 -f 2" "a\0302\0267b\0302\0267c" "b" "\0267b" -test_cut "-d \0302\0267 -f 3,2" "a\0302\0267b\0302\0267c" "b\0302\0267c" \ +test_cut 0 "-d \0302\0267 -f 2" "a\0302\0267b\0302\0267c" "b" "\0267b" +test_cut 0 "-d \0302\0267 -f 3,2" "a\0302\0267b\0302\0267c" "b\0302\0267c" \ "\0267b\0302\0267c" +# invalid list values +test_cut 1 "-b 2,-,4" +test_cut 1 "-c 2,--,4" +test_cut 1 "-f 2,---,4" +test_cut 1 "-b 0-1" +test_cut 1 "-c 2147483648" +test_cut 1 "-f not,a-number" + exit 0 |