Denys Vlasenko
2ca39ffd44
awk: fix subst code to handle "start of word" pattern correctly (needs REG_STARTEND)
...
function old new delta
awk_sub 637 714 +77
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-06-08 10:42:39 +02:00
Denys Vlasenko
113685fbcd
awk: fix SEGV on read error in -f PROGFILE
...
function old new delta
awk_main 829 843 +14
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-06-07 10:54:34 +02:00
Denys Vlasenko
f4789164e0
awk: code shrink
...
function old new delta
awk_sub 544 548 +4
exec_builtin 1136 1130 -6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 4/-6) Total: -2 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-06-06 12:48:11 +02:00
Denys Vlasenko
5f84c56336
awk: fix backslash handling in sub() builtins
...
function old new delta
awk_sub 559 544 -15
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-06-03 00:42:10 +02:00
Denys Vlasenko
0256e00a9d
awk: fix precedence of = relative to ==
...
Discovered while adding code to disallow assignments to non-lvalues
function old new delta
parse_expr 936 991 +55
.rodata 105243 105247 +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 59/0) Total: 59 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-30 16:44:04 +02:00
Denys Vlasenko
721bf6eaf4
awk: printf(INVALID_FMT) prints it verbatim
...
function old new delta
awk_printf 628 640 +12
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-29 10:55:40 +02:00
Denys Vlasenko
4d7339204f
awk: shrink - use setvar_sn() to set variables from non-NUL terminated strings
...
function old new delta
setvar_sn - 39 +39
exec_builtin 1145 1136 -9
awk_getline 591 559 -32
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 39/-41) Total: -2 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-28 18:08:06 +02:00
Denys Vlasenko
05e60007d4
awk: code shrink
...
function old new delta
awk_getline 620 591 -29
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-28 17:51:59 +02:00
Denys Vlasenko
b76b420b5d
awk: fix closing of non-opened file
...
function old new delta
setvar_ERRNO - 53 +53
.rodata 105252 105246 -6
awk_getline 639 620 -19
evaluate 3402 3377 -25
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/3 up/down: 53/-50) Total: 3 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-28 17:25:56 +02:00
Denys Vlasenko
21dce1c3c3
awk: do not read ARGIND, only set it (gawk compat)
...
function old new delta
next_input_file 216 243 +27
evaluate 3396 3402 +6
awk_main 826 829 +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 36/0) Total: 36 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-27 19:11:28 +02:00
Denys Vlasenko
5c8a9dfd97
awk: remove a local variable "caching" a struct member
...
Since we take its address, the variable lives on stack (not a GPR).
Thus, nothing is improved by caching it.
function old new delta
awk_getline 642 639 -3
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-27 18:21:38 +02:00
Denys Vlasenko
528808bcd2
awk: get rid of one indirection level for iF (input file structure)
...
function old new delta
try_to_assign - 91 +91
next_input_file 214 216 +2
awk_main 827 826 -1
evaluate 3403 3396 -7
is_assignment 91 - -91
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 1/2 up/down: 93/-99) Total: -6 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-27 18:05:42 +02:00
Denys Vlasenko
84ff1825dd
awk: fix splitting with default FS
...
function old new delta
awk_split 543 544 +1
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-27 16:17:38 +02:00
Denys Vlasenko
5dcc443dba
awk: fix use-after-realloc (CVE-2021-42380), closes 15601
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2023-05-26 19:36:58 +02:00
Natanael Copa
e63d7cdfda
awk: fix use after free (CVE-2022-30065)
...
fixes https://bugs.busybox.net/show_bug.cgi?id=14781
function old new delta
evaluate 3343 3357 +14
Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2022-07-11 17:18:07 +02:00
Denys Vlasenko
e2952dfaff
awk: input numbers are never octal or hex (only program consts can be)
...
function old new delta
next_token 825 930 +105
getvar_i 114 129 +15
nextchar 49 53 +4
my_strtod 138 - -138
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 3/0 up/down: 124/-138) Total: -14 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2022-01-08 22:42:35 +01:00
Denys Vlasenko
857800c655
awk: never return NULL from awk_printf()
...
function old new delta
awk_printf 651 628 -23
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-09-09 19:26:39 +02:00
Denys Vlasenko
e60c56932e
awk: code shrink
...
function old new delta
awk_printf 652 651 -1
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-09-09 19:13:32 +02:00
Denys Vlasenko
8a0adba9f6
awk: code shrink: avoid duplicate NUL checks and strlen()
...
function old new delta
awk_printf 665 652 -13
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-09-09 18:58:39 +02:00
Ron Yorston
305a30d80b
awk: fix read beyond end of buffer
...
Commit 7d06d6e18
(awk: fix printf %%) can cause awk printf to read
beyond the end of a strduped buffer:
2349 while (*f && *f != '%')
2350 f++;
2351 c = *++f;
If the loop terminates because a NUL character is detected the
character after the NUL is read. This can result in failures
depending on the value of that character.
function old new delta
awk_printf 672 665 -7
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-09-09 18:12:21 +02:00
Daniel Thau
7d06d6e186
awk: fix printf %%
...
A refactor of the awk printf code in
e2e3802987
appears to have broken the printf interpretation of two percent signs,
which normally outputs only one percent sign.
The patch below brings busybox awk printf behavior back into alignment
with the pre-e2e380 behavior, the busybox printf util, and other common
(awk and non-awk) printf implementations.
function old new delta
awk_printf 626 672 +46
Signed-off-by: Daniel Thau <danthau at bedrocklinux.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-09-05 03:42:51 +02:00
Denys Vlasenko
dabbeeb793
awk: whitespace and debugging tweaks
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-14 16:58:05 +02:00
Denys Vlasenko
d3480dd582
awk: disallow break/continue outside of loops
...
function old new delta
.rodata 104139 104186 +47
chain_group 610 633 +23
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 70/0) Total: 70 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-14 16:32:19 +02:00
Denys Vlasenko
d62627487a
awk: tighten parsing - disallow extra semicolons
...
'; BEGIN {...}' and 'BEGIN {...} ;; {...}' are not accepted by gawk
function old new delta
parse_program 332 353 +21
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-14 16:32:19 +02:00
Denys Vlasenko
ab755e3717
awk: in parsing, remove superfluous NEWLINE check; optimize builtin arg evaluation
...
function old new delta
exec_builtin 1149 1145 -4
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-12 13:30:30 +02:00
Denys Vlasenko
8d269ef859
awk: fix printf "%-10c", 0
...
function old new delta
awk_printf 596 626 +30
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-12 11:27:11 +02:00
Denys Vlasenko
caa93ecdd3
awk: fix corner case in awk_printf
...
Example where it wasn't working:
awk 'BEGIN { printf "qwe %s rty %c uio\n", "a", 0, "c" }'
- the NUL printing in %c caused premature stop of printing.
function old new delta
awk_printf 593 596 +3
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-11 18:16:10 +02:00
Denys Vlasenko
39aabfe8f0
awk: unbreak "cmd" | getline
...
function old new delta
evaluate 3337 3343 +6
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-11 12:51:43 +02:00
Denys Vlasenko
4ef8841b21
awk: unbreak "printf('%c') can output NUL" testcase
...
function old new delta
awk_printf 546 593 +47
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-11 12:25:33 +02:00
Denys Vlasenko
3d57a84907
awk: undo TI_PRINT, it introduced a bug (print with any redirect acting as printf)
...
function old new delta
evaluate 3329 3337 +8
Patch by Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-11 12:00:31 +02:00
Denys Vlasenko
49c3ce64f0
awk: rollback_token() + chain_group() == chain_until_rbrace()
...
function old new delta
parse_program 336 332 -4
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-11 11:46:21 +02:00
Denys Vlasenko
e2e3802987
awk: fix printf buffer overflow
...
function old new delta
awk_printf 468 546 +78
fmt_num 239 247 +8
getvar_s 125 111 -14
evaluate 3343 3329 -14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/2 up/down: 86/-28) Total: 58 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-04 01:25:34 +02:00
Denys Vlasenko
08ca313d7e
awk: simplify tests for operation class
...
Usually, an operation class has only one possible value of "info" word.
In this case, just compare the entire info word, do not bother
to mask OPCLSMASK bits.
(Example where this is not the case: OC_REPLACE for "<op>=")
function old new delta
mk_splitter 106 100 -6
chain_group 616 610 -6
nextarg 40 32 -8
exec_builtin 1157 1149 -8
as_regex 111 103 -8
awk_split 553 543 -10
parse_expr 948 936 -12
awk_getline 656 642 -14
evaluate 3387 3343 -44
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/9 up/down: 0/-116) Total: -116 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 14:11:51 +02:00
Denys Vlasenko
cb042b0582
awk: restore strdup elision optimization in assignment
...
function old new delta
evaluate 3339 3387 +48
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 13:30:45 +02:00
Denys Vlasenko
90404ed2f6
awk: match(): code shrink
...
function old new delta
do_match - 165 +165
exec_builtin_match 202 - -202
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 0/0 up/down: 165/-202) Total: -37 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 12:20:36 +02:00
Denys Vlasenko
0e3ef4efb0
awk: rand(): 64-bit constants should be ULL
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 11:57:59 +02:00
Denys Vlasenko
2211fa70cc
awk: do not use a copy of g_progname for node->l.new_progname
...
We never destroy g_progname's, the strings still exist, no need to copy
function old new delta
chain_node 104 97 -7
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 11:54:01 +02:00
Denys Vlasenko
e1e7ad6b60
awk: support %F %a %A in printf
...
function old new delta
.rodata 104111 104120 +9
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 01:59:36 +02:00
Denys Vlasenko
1f765709ed
awk: open-code TS_OPTERM, no logic changes
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 01:32:03 +02:00
Denys Vlasenko
2b65e73db3
awk: tighten rules in action parsing
...
Disallow:
BEGIN
{ action } - must start on the same line
Disallow:
func f()
print "hello" - must be in {...}
function old new delta
chain_until_rbrace - 41 +41
parse_program 307 336 +29
chain_group 649 616 -33
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 70/-33) Total: 37 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 01:16:48 +02:00
Denys Vlasenko
717200eb43
awk: rename GRPSTART/END to L/RBRACE, no code changes
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-03 00:39:55 +02:00
Denys Vlasenko
b705bf5539
awk: move match() code out-of-line
...
function old new delta
exec_builtin_match - 202 +202
exec_builtin 1434 1157 -277
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/1 up/down: 202/-277) Total: -75 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 23:48:48 +02:00
Denys Vlasenko
646429e05e
awk: use smaller regmatch_t arrays, they had 2 elements for no apparent reason
...
function old new delta
exec_builtin 1479 1434 -45
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 23:26:09 +02:00
Denys Vlasenko
a5d7b0f4f4
awk: fix detection of VAR=VAL arguments
...
1NAME=VAL is not it, neither is VA.R=VAL
function old new delta
next_input_file 216 214 -2
is_assignment 115 91 -24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-26) Total: -26 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 23:07:21 +02:00
Denys Vlasenko
4d902ea9de
awk: fix beavior of "exit" without parameter
...
function old new delta
evaluate 3336 3339 +3
awk_exit 93 94 +1
awk_main 829 827 -2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 4/-2) Total: 2 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 22:28:51 +02:00
Denys Vlasenko
8bb03da906
awk: rand() could return 1.0, fix this - should be in [0,1)
...
While at it, make it finer-grained (63 bits of randomness)
function old new delta
evaluate 3303 3336 +33
.rodata 104107 104111 +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 37/0) Total: 37 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 19:38:03 +02:00
Denys Vlasenko
37ae8cdc6e
awk: beautify builtins table, no code changes
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 18:55:00 +02:00
Denys Vlasenko
47d9133896
awk: enforce simple builtins' argument number
...
function old new delta
evaluate 3215 3303 +88
.rodata 104036 104107 +71
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 159/0) Total: 159 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 18:28:12 +02:00
Denys Vlasenko
786ca197ad
awk: make builtin definitions more understandable, no code changes
...
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 17:32:08 +02:00
Denys Vlasenko
640212ae0e
awk: do not special-case "delete"
...
Rework of the previous fix:
Can use operation attributes to disable arg evaluation instead of special-casing.
function old new delta
.rodata 104032 104036 +4
evaluate 3223 3215 -8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 4/-8) Total: -4 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
2021-07-02 15:21:36 +02:00