oweals/busybox.git
5 years agobc: convert BC_STATUS_EXEC_SIGNAL - its message string was never used
Denys Vlasenko [Tue, 4 Dec 2018 18:11:02 +0000 (19:11 +0100)]
bc: convert BC_STATUS_EXEC_SIGNAL - its message string was never used

function                                             old     new   delta
bc_vm_process                                        132     130      -2
bc_err_msgs                                          168     164      -4
dc_parse_parse                                        52      47      -5
bc_parse_reset                                       187     181      -6
bc_program_ready_msg                                  22       -     -22
bc_program_exec                                     4478    4453     -25
bc_parse_parse                                       461     432     -29
bc_program_reset                                     159     105     -54
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/7 up/down: 0/-147)           Total: -147 bytes
   text    data     bss     dec     hex filename
 987923     485    7296  995704   f3178 busybox_old
 987766     485    7296  995547   f30db busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert BC_STATUS_PARSE_NO_AUTO
Denys Vlasenko [Mon, 3 Dec 2018 20:46:41 +0000 (21:46 +0100)]
bc: convert BC_STATUS_PARSE_NO_AUTO

function                                             old     new   delta
bc_parse_auto                                        275     291     +16
bc_err_msgs                                          172     168      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 16/-4)              Total: 12 bytes
   text    data     bss     dec     hex filename
 987911     485    7296  995692   f316c busybox_old
 987923     485    7296  995704   f3178 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert BC_STATUS_EXEC_MISMATCHED_PARAMS and BC_STATUS_EXEC_UNDEFINED_FUNC
Denys Vlasenko [Mon, 3 Dec 2018 20:10:57 +0000 (21:10 +0100)]
bc: convert BC_STATUS_EXEC_MISMATCHED_PARAMS and BC_STATUS_EXEC_UNDEFINED_FUNC

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: BC_STATUS_VEC_ITEM_EXISTS is not a real error code, its message was never used
Denys Vlasenko [Mon, 3 Dec 2018 19:35:16 +0000 (20:35 +0100)]
bc: BC_STATUS_VEC_ITEM_EXISTS is not a real error code, its message was never used

It was only used to indicate rusult of bc_map_insert() - did we insert, or
did we find that this key is already in the map?

function                                             old     new   delta
bc_map_insert                                        142     145      +3
bc_program_addFunc                                   226     225      -1
bc_err_msgs                                          184     180      -4
bc_program_search                                    152     143      -9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/3 up/down: 3/-14)             Total: -11 bytes
   text    data     bss     dec     hex filename
 987904     485    7296  995685   f3165 busybox_old
 987873     485    7296  995654   f3146 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify bc_lex_comment()
Denys Vlasenko [Mon, 3 Dec 2018 18:12:29 +0000 (19:12 +0100)]
bc: simplify bc_lex_comment()

function                                             old     new   delta
bc_lex_token                                        1369    1344     -25

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: handle BIN_FILE and LEX_BAD_CHAR errors at the site of detection
Denys Vlasenko [Mon, 3 Dec 2018 15:06:02 +0000 (16:06 +0100)]
bc: handle BIN_FILE and LEX_BAD_CHAR errors at the site of detection

The most informative message can be generated at the location
where error is detected. The "error codes" are stupid:
print error meesage immediately, then just return "there was an error"
indicator.

All error codes will be converted. For now, converting these two.

For now, this and following changes will degrade error messages
quality. For example, file name and line number printouts may be lost.
This will be re-added later.

This change anlso fixes handling of invalid stdin input:
this used to cause interactive bc to exit:

....
>>> ς
bc: illegal character 0xcf
bc: illegal character 0x82
>>> _

function                                             old     new   delta
bc_error                                               -      42     +42
bc_lex_token                                        1333    1369     +36
dc_lex_token                                         675     695     +20
bc_read_line                                         311     325     +14
bc_num_a                                             456     454      -2
bc_err_msgs                                          188     184      -4
bc_num_ulong                                          95      85     -10
bc_vm_run                                           1984    1955     -29
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 3/4 up/down: 112/-45)            Total: 67 bytes
   text    data     bss     dec     hex filename
 987828     485    7296  995609   f3119 busybox_old
 987929     485    7296  995710   f317e busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: eliminate BC_STATUS_INPUT_EOF
Denys Vlasenko [Mon, 3 Dec 2018 13:28:51 +0000 (14:28 +0100)]
bc: eliminate BC_STATUS_INPUT_EOF

function                                             old     new   delta
fflush_and_check                                       -      36     +36
bc_num_a                                             445     456     +11
bc_num_ulong                                          85      95     +10
bc_vm_run                                           1978    1984      +6
bc_num_s                                             246     252      +6
bc_err_msgs                                          192     188      -4
quit                                                  38      32      -6
bc_vm_process                                        139     132      -7
bc_program_reset                                     172     159     -13
bc_parse_create                                      192     175     -17
bc_read_line                                         349     311     -38
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 4/6 up/down: 69/-85)            Total: -16 bytes
   text    data     bss     dec     hex filename
 987844     485    7296  995625   f3129 busybox_old
 987828     485    7296  995609   f3119 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: handle "limits" and "quit" immediately at parse time
Denys Vlasenko [Mon, 3 Dec 2018 13:02:35 +0000 (14:02 +0100)]
bc: handle "limits" and "quit" immediately at parse time

No need to propagate a special exit code.

function                                             old     new   delta
bc_parse_stmt                                       2197    2301    +104
quit                                                   -      38     +38
bc_read_line                                         344     349      +5
bc_program_reset                                     174     172      -2
bc_num_s                                             252     246      -6
bc_num_a                                             454     445      -9
bc_parse_parse                                       471     461     -10
bc_num_ulong                                          95      85     -10
bc_program_exec                                     4500    4478     -22
bc_vm_run                                           2006    1978     -28
bc_vm_process                                        291     139    -152
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/8 up/down: 147/-239)          Total: -92 bytes
   text    data     bss     dec     hex filename
 987936     485    7296  995717   f3185 busybox_old
 987844     485    7296  995625   f3129 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc": drop unused error codes and strings
Denys Vlasenko [Sun, 2 Dec 2018 23:51:25 +0000 (00:51 +0100)]
bc": drop unused error codes and strings

function                                             old     new   delta
bc_err_msgs                                          216     192     -24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-24)             Total: -24 bytes
   text    data     bss     dec     hex filename
 988122     485    7296  995903   f323f busybox_old
 987936     485    7296  995717   f3185 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove "error ids": serve no useful purpose, error message should be explanatory...
Denys Vlasenko [Sun, 2 Dec 2018 23:26:12 +0000 (00:26 +0100)]
bc: remove "error ids": serve no useful purpose, error message should be explanatory enough

function                                             old     new   delta
bc_warn_fmt                                           17      14      -3
bc_err_fmt                                            15      12      -3
bc_vm_posixError                                     205     189     -16
bc_vm_error                                          156     138     -18
bc_errs                                               28       -     -28
bc_err_ids                                            58       -     -58
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 0/4 up/down: 0/-126)           Total: -126 bytes
   text    data     bss     dec     hex filename
 988288     485    7296  996069   f32e5 busybox_old
 988122     485    7296  995903   f323f busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: reduce forward declarations
Denys Vlasenko [Sun, 2 Dec 2018 23:08:59 +0000 (00:08 +0100)]
bc: reduce forward declarations

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: use smaller datatypes for limits, match GNU bc 'limits' output
Denys Vlasenko [Sun, 2 Dec 2018 20:02:54 +0000 (21:02 +0100)]
bc: use smaller datatypes for limits, match GNU bc 'limits' output

function                                             old     new   delta
bc_vm_process                                        315     291     -24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-24)             Total: -24 bytes
   text    data     bss     dec     hex filename
 988303     485    7296  996084   f32f4 busybox_old
 988273     485    7296  996054   f32d6 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: better handle optional args of bc_program_pushVar()
Denys Vlasenko [Sun, 2 Dec 2018 19:57:17 +0000 (20:57 +0100)]
bc: better handle optional args of bc_program_pushVar()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: tweak help text
Denys Vlasenko [Sun, 2 Dec 2018 19:34:03 +0000 (20:34 +0100)]
bc: tweak help text

-v is supported but not shown

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify bc_vm_stdin()
Denys Vlasenko [Sun, 2 Dec 2018 19:16:52 +0000 (20:16 +0100)]
bc: simplify bc_vm_stdin()

function                                             old     new   delta
bc_vm_run                                           2020    2006     -14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: only check for ^C in bc_program_exec() main loop
Denys Vlasenko [Sun, 2 Dec 2018 18:43:34 +0000 (19:43 +0100)]
bc: only check for ^C in bc_program_exec() main loop

Checking it in individual operations such as SQRT is not necessary
since they usually do not take very long to complete. We repeatedly return
to main loop.

TODO: re-add more fine-grained ^C checks - but only with examples where it is
actually needed. E.g. I suspect simplest ops like addition or compare won't need it.

function                                             old     new   delta
bc_program_index                                      66      64      -2
bc_num_s                                             258     246     -12
bc_num_cmp                                           294     275     -19
bc_num_compare                                        84      59     -25
bc_num_subArrays                                      74      47     -27
bc_num_a                                             474     445     -29
bc_program_exec                                     4530    4500     -30
bc_num_p                                             518     472     -46
bc_num_d                                             604     558     -46
bc_num_k                                            1005     957     -48
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/10 up/down: 0/-284)          Total: -284 bytes
   text    data     bss     dec     hex filename
 988601     485    7296  996382   f341e busybox_old
 988317     485    7296  996098   f3302 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simpler calling convention for bc_read_file(), bc_program_search()
Denys Vlasenko [Sun, 2 Dec 2018 18:27:48 +0000 (19:27 +0100)]
bc: simpler calling convention for bc_read_file(), bc_program_search()

function                                             old     new   delta
bc_vm_run                                           1854    2020    +166
bc_program_assign                                    482     476      -6
bc_program_pushVar                                   225     215     -10
bc_program_call                                      366     356     -10
bc_program_num                                      1126    1115     -11
bc_program_copyToVar                                 354     343     -11
bc_program_search                                    164     152     -12
bc_program_execStr                                   573     559     -14
bc_program_exec                                     4544    4530     -14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/8 up/down: 166/-88)            Total: 78 bytes
   text    data     bss     dec     hex filename
 988523     485    7296  996304   f33d0 busybox_old
 988601     485    7296  996382   f341e busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: bc_num_ulong2num(), bc_program_pushGlobal(), bc_program_stackLen() never fail
Denys Vlasenko [Sun, 2 Dec 2018 17:44:40 +0000 (18:44 +0100)]
bc: bc_num_ulong2num(), bc_program_pushGlobal(), bc_program_stackLen() never fail

function                                             old     new   delta
bc_num_ulong2num                                      66      62      -4
bc_num_printNum                                      572     563      -9
bc_program_exec                                     4562    4544     -18
bc_program_num                                      1147    1126     -21
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-52)             Total: -52 bytes
   text    data     bss     dec     hex filename
 988575     485    7296  996356   f3404 busybox_old
 988523     485    7296  996304   f33d0 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: stop passing around pointers to G.prog, they are all constant
Denys Vlasenko [Sun, 2 Dec 2018 17:26:38 +0000 (18:26 +0100)]
bc: stop passing around pointers to G.prog, they are all constant

function                                             old     new   delta
bc_program_exec                                     4523    4562     +39
bc_program_assign                                    450     482     +32
bc_program_assignStr                                 131     159     +28
bc_program_print                                     762     775     +13
bc_program_num                                      1134    1147     +13
bc_program_search                                    154     164     +10
bc_num_ulong                                          85      95     +10
dc_parse_expr                                        719     727      +8
bc_program_retire                                     34      40      +6
bc_program_reset                                     168     174      +6
bc_program_binOpRetire                                50      56      +6
bc_program_addFunc                                   220     226      +6
bc_program_prep                                       88      89      +1
dc_parse_init                                         18      17      -1
bc_program_copyToVar                                 355     354      -1
bc_parse_text                                        142     141      -1
bc_parse_number                                       88      87      -1
bc_parse_init                                         18      17      -1
bc_parse_endBody                                     423     422      -1
common_parse_init                                     29      26      -3
bc_parse_string                                      103     100      -3
bc_parse_addFunc                                      44      41      -3
bc_program_call                                      371     366      -5
bc_program_binOpPrep                                 301     296      -5
bc_program_read                                      342     336      -6
bc_parse_create                                      198     192      -6
bc_program_pushArray                                 143     136      -7
bc_parse_reset                                       194     187      -7
bc_vm_process                                        323     315      -8
bc_program_pushVar                                   236     225     -11
bc_vm_run                                           1872    1854     -18
bc_parse_name                                        590     570     -20
bc_program_execStr                                   594     573     -21
bc_program_modexp                                    793     763     -30
bc_program_printStream                               172       -    -172
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 13/21 up/down: 178/-331)       Total: -153 bytes
   text    data     bss     dec     hex filename
 988728     485    7296  996509   f349d busybox_old
 988575     485    7296  996356   f3404 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: select parse_init() and parse_expr() using IS_BC, not function pointers
Denys Vlasenko [Sun, 2 Dec 2018 16:36:00 +0000 (17:36 +0100)]
bc: select parse_init() and parse_expr() using IS_BC, not function pointers

function                                             old     new   delta
common_parse_expr                                      -      62     +62
common_parse_init                                      -      29     +29
dc_parse_parse                                        53      52      -1
dc_parse_expr                                        723     719      -4
bc_program_execStr                                   606     594     -12
dc_parse_init                                         33      18     -15
bc_parse_init                                         33      18     -15
bc_parse_expression                                   39       -     -39
bc_vm_run                                           1923    1872     -51
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 0/6 up/down: 91/-137)           Total: -46 bytes
   text    data     bss     dec     hex filename
 988774     485    7296  996555   f34cb busybox_old
 988728     485    7296  996509   f349d busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: propagate fixed arguments into callees
Denys Vlasenko [Sun, 2 Dec 2018 16:18:52 +0000 (17:18 +0100)]
bc: propagate fixed arguments into callees

Looks like there is only one "BcProgram" object, &G.prog.

function                                             old     new   delta
bc_program_exec                                     4401    4523    +122
bc_program_execStr                                   579     606     +27
bc_program_read                                      323     342     +19
bc_args                                               83      97     +14
bc_vm_process                                        327     323      -4
bc_num_ulong                                          95      85     -10
dc_main                                               62      48     -14
bc_main                                               62      48     -14
bc_vm_run                                           2317    1923    -394
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/5 up/down: 182/-436)         Total: -254 bytes
   text    data     bss     dec     hex filename
 989028     485    7296  996809   f35c9 busybox_old
 988774     485    7296  996555   f34cb busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify ^C handling
Denys Vlasenko [Sun, 2 Dec 2018 15:32:36 +0000 (16:32 +0100)]
bc: simplify ^C handling

It's still buggy: if SIGINT would interrupt e.g. output write(),
the result would not be as intended:

>>> while ( 1 ) print 1
...
11111111111111111111111111111111111111111111111111111111111111111111\
11111111111111111111111111111111111111111111111111111111111111111111\
^Cready for more input

interrupt (type "quit" to exit)
>>> bc: output error

function                                             old     new   delta
dc_parse_parse                                        58      53      -5
bc_parse_parse                                       476     471      -5
bc_num_d                                             609     604      -5
bc_num_cmp                                           299     294      -5
bc_num_compare                                        90      84      -6
bc_parse_expr                                       2222    2215      -7
bc_num_subArrays                                      82      74      -8
dc_main                                               72      62     -10
bc_main                                               72      62     -10
bc_program_exec                                     4413    4401     -12
bc_num_a                                             491     474     -17
bc_read_line                                         364     344     -20
bc_num_p                                             540     518     -22
bc_program_reset                                     192     168     -24
bc_num_k                                            1031    1005     -26
bc_vm_run                                           2382    2317     -65
bc_vm_sig                                             97       -     -97
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/16 up/down: 0/-344)          Total: -344 bytes
   text    data     bss     dec     hex filename
 989372     485    7296  997153   f3721 busybox_old
 989028     485    7296  996809   f35c9 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert to "G trick" - this returns bc to zero bss increase
Denys Vlasenko [Sun, 2 Dec 2018 14:48:37 +0000 (15:48 +0100)]
bc: convert to "G trick" - this returns bc to zero bss increase

function                                             old     new   delta
bc_num_p                                             518     540     +22
bc_num_k                                            1010    1031     +21
bc_vm_process                                        312     327     +15
bc_program_exec                                     4401    4413     +12
bc_vm_posixError                                     194     205     +11
bc_num_a                                             480     491     +11
bc_program_reset                                     182     192     +10
bc_vm_sig                                             88      97      +9
bc_vm_error                                          148     156      +8
bc_parse_expr                                       2215    2222      +7
bc_num_compare                                        84      90      +6
dc_parse_parse                                        53      58      +5
dc_lex_token                                         670     675      +5
bc_read_line                                         359     364      +5
bc_parse_parse                                       471     476      +5
bc_num_cmp                                           294     299      +5
bc_num_subArrays                                      84      82      -2
bc_num_d                                             614     609      -5
dc_main                                               80      72      -8
bc_main                                               80      72      -8
bcg                                                   40       -     -40
bc_vm_run                                           2569    2382    -187
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 16/5 up/down: 157/-250)         Total: -93 bytes
   text    data     bss     dec     hex filename
 989425     485    7336  997246   f377e busybox_old
 989372     485    7296  997153   f3721 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify, and restore ^C, fix ^D handling
Denys Vlasenko [Sun, 2 Dec 2018 13:35:32 +0000 (14:35 +0100)]
bc: simplify, and restore ^C, fix ^D handling

^D used to enter infinite loop

function                                             old     new   delta
bc_read_line                                         342     359     +17
bc_args_opt                                            8       -      -8
dc_sig_msg                                            31       -     -31
bc_sig_msg                                            34       -     -34
bc_vm_run                                           2608    2569     -39
bc_args                                              123      83     -40
bc_args_lopt                                          81       -     -81
------------------------------------------------------------------------------
(add/remove: 0/4 grow/shrink: 1/2 up/down: 17/-233)          Total: -216 bytes
   text    data     bss     dec     hex filename
 989491     485    7336  997312   f37c0 busybox_old
 989425     485    7336  997246   f377e busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify, stop testing for IO errors on every output
Denys Vlasenko [Fri, 30 Nov 2018 22:13:42 +0000 (23:13 +0100)]
bc: simplify, stop testing for IO errors on every output

function                                             old     new   delta
bc_read_line                                         297     342     +45
bc_vm_run                                           2601    2608      +7
bc_program_reset                                     178     182      +4
bc_args                                              125     123      -2
dc_name                                                3       -      -3
bc_name                                                3       -      -3
bc_program_printStream                               176     172      -4
bcg                                                   48      40      -8
dc_main                                               97      80     -17
bc_main                                               97      80     -17
bc_vm_fflush                                          21       -     -21
bc_vm_puts                                            23       -     -23
bc_vm_printf                                          36       -     -36
bc_vm_putchar                                         46       -     -46
bc_vm_exit                                            46       -     -46
bc_vm_process                                        361     312     -49
bc_vm_info                                            76      19     -57
bc_copyright                                         155       -    -155
------------------------------------------------------------------------------
(add/remove: 0/8 grow/shrink: 3/7 up/down: 56/-487)          Total: -431 bytes
   text    data     bss     dec     hex filename
 989722     485    7344  997551   f38af busybox_old
 989491     485    7336  997312   f37c0 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix warnings, initial cleanups
Denys Vlasenko [Sun, 2 Dec 2018 17:49:16 +0000 (18:49 +0100)]
bc: fix warnings, initial cleanups

function                                             old     new   delta
bc_program_exec                                        -    4401   +4401
bc_vm_run                                              -    2601   +2601
bc_parse_expr                                          -    2215   +2215
bc_parse_stmt                                          -    2197   +2197
bc_lib                                                 -    1878   +1878
bc_lex_token                                           -    1333   +1333
bc_program_num                                         -    1134   +1134
bc_num_k                                               -    1010   +1010
bc_program_modexp                                      -     793    +793
bc_program_print                                       -     762    +762
dc_parse_expr                                          -     723    +723
dc_lex_token                                           -     670    +670
bc_num_d                                               -     614    +614
bc_parse_name                                          -     590    +590
bc_program_execStr                                     -     579    +579
bc_num_printNum                                        -     572    +572
bc_num_p                                               -     518    +518
bc_num_a                                               -     480    +480
bc_parse_parse                                         -     471    +471
bc_program_assign                                      -     450    +450
bc_parse_endBody                                       -     423    +423
bc_program_call                                        -     371    +371
dc_lex_tokens                                          -     364    +364
bc_vm_process                                          -     361    +361
bc_program_copyToVar                                   -     355    +355
dc_parse_insts                                         -     332    +332
bc_program_read                                        -     323    +323
bc_program_binOpPrep                                   -     301    +301
bc_lex_number                                          -     301    +301
bc_read_line                                           -     297    +297
bc_num_cmp                                             -     294    +294
bc_num_m                                               -     287    +287
bc_parse_auto                                          -     275    +275
bc_num_s                                               -     258    +258
bc_program_pushVar                                     -     236    +236
bc_num_r                                               -     231    +231
bc_program_addFunc                                     -     220    +220
bc_lex_kws                                             -     220    +220
bc_err_msgs                                            -     216    +216
bc_parse_create                                        -     198    +198
bc_vm_posixError                                       -     194    +194
bc_parse_reset                                         -     194    +194
bc_parse_operator                                      -     181    +181
bc_program_reset                                       -     178    +178
bc_program_printStream                                 -     176    +176
bc_num_divmod                                          -     168    +168
bc_copyright                                           -     155    +155
bc_program_search                                      -     154    +154
bc_num_binary                                          -     150    +150
bc_vm_error                                            -     148    +148
bc_program_pushArray                                   -     143    +143
bc_parse_text                                          -     142    +142
bc_num_printDigits                                     -     142    +142
bc_map_insert                                          -     142    +142
bc_parse_else                                          -     139    +139
bc_program_assignStr                                   -     131    +131
bc_args                                                -     125    +125
dc_parse_mem                                           -     116    +116
bc_parse_body                                          -     116    +116
bc_num_split                                           -     113    +113
bc_num_sub                                             -     112    +112
bc_num_add                                             -     112    +112
packed_usage                                       32958   33066    +108
bc_num_rem                                             -     104    +104
bc_parse_string                                        -     103    +103
bc_main                                                -      97     +97
bc_num_ulong                                           -      95     +95
bc_func_insert                                         -      89     +89
bc_vm_sig                                              -      88     +88
bc_program_prep                                        -      88     +88
bc_parse_number                                        -      88     +88
bc_array_expand                                        -      88     +88
bc_num_subArrays                                       -      84     +84
bc_num_compare                                         -      84     +84
bc_lex_name                                            -      83     +83
bc_args_lopt                                           -      81     +81
bc_parse_pushIndex                                     -      80     +80
bc_num_mul                                             -      80     +80
bc_num_mod                                             -      80     +80
bc_num_div                                             -      80     +80
bc_vm_info                                             -      76     +76
bc_program_name                                        -      75     +75
bc_map_find                                            -      71     +71
bc_lex_next                                            -      71     +71
bc_num_printHex                                        -      70     +70
bc_vec_concat                                          -      68     +68
bc_num_shift                                           -      68     +68
bc_num_extend                                          -      68     +68
bc_program_index                                       -      66     +66
bc_num_ulong2num                                       -      66     +66
bc_num_retireMul                                       -      66     +66
bc_parse_noElse                                        -      65     +65
bc_vec_string                                          -      64     +64
bc_parse_pushName                                      -      63     +63
bc_parse_exprs                                         -      60     +60
bc_err_ids                                             -      58     +58
bc_result_free                                         -      57     +57
bc_vec_npop                                            -      55     +55
dc_parse_parse                                         -      53     +53
bc_vec_push                                            -      53     +53
bc_parse_free                                          -      53     +53
bc_num_inv                                             -      53     +53
dc_parse_register                                      -      52     +52
dc_lex_regs                                            -      52     +52
bc_lex_whitespace                                      -      52     +52
bc_num_copy                                            -      51     +51
bc_program_binOpRetire                                 -      50     +50
bc_parse_ops                                           -      50     +50
bc_map_index                                           -      50     +50
bcg                                                    -      48     +48
bc_num_init                                            -      48     +48
bc_parse_startBody                                     -      47     +47
bc_num_pow                                             -      47     +47
bc_vm_putchar                                          -      46     +46
bc_vm_exit                                             -      46     +46
bc_num_clean                                           -      45     +45
bc_parse_addFunc                                       -      44     +44
bc_vec_grow                                            -      42     +42
bc_program_len                                         -      42     +42
bc_num_truncate                                        -      42     +42
bc_array_init                                          -      42     +42
bc_parse_expression                                    -      39     +39
bc_lex_lineComment                                     -      39     +39
bc_num_expand                                          -      38     +38
bc_vec_init                                            -      37     +37
bc_vm_printf                                           -      36     +36
bc_num_printNewline                                    -      36     +36
bc_func_free                                           -      35     +35
bc_sig_msg                                             -      34     +34
bc_program_retire                                      -      34     +34
bc_lex_assign                                          -      34     +34
dc_parse_init                                          -      33     +33
bc_parse_init                                          -      33     +33
dc_sig_msg                                             -      31     +31
bc_vec_expand                                          -      30     +30
bc_num_ten                                             -      30     +30
bc_num_one                                             -      28     +28
bc_errs                                                -      28     +28
bc_vec_free                                            -      27     +27
bc_program_ops                                         -      24     +24
bc_vm_puts                                             -      23     +23
bc_num_printChar                                       -      23     +23
bc_program_ready_msg                                   -      22     +22
bc_vm_fflush                                           -      21     +21
dc_main                                               77      97     +20
bc_parse_next_rel                                      -      20     +20
bc_parse_next_read                                     -      20     +20
bc_parse_next_print                                    -      20     +20
bc_parse_next_param                                    -      20     +20
bc_parse_next_for                                      -      20     +20
bc_parse_next_expr                                     -      20     +20
bc_parse_next_elem                                     -      20     +20
bc_warn_fmt                                            -      17     +17
bc_vec_pushByte                                        -      15     +15
bc_string_free                                         -      15     +15
bc_num_setToZero                                       -      15     +15
bc_num_free                                            -      15     +15
bc_lex_file                                            -      15     +15
bc_id_free                                             -      15     +15
bc_err_fmt                                             -      15     +15
bc_vec_item_rev                                        -      14     +14
bc_id_cmp                                              -      12     +12
bc_num_zero                                            -      11     +11
bc_vec_item                                            -       9      +9
bc_program_stdin_name                                  -       8      +8
bc_program_scale                                       -       8      +8
bc_args_opt                                            -       8      +8
bc_func_read                                           -       7      +7
bc_func_main                                           -       7      +7
bc_err_line                                            -       7      +7
bc_lib_name                                            -       4      +4
bc_args_env_name                                       -       4      +4
applet_main                                         1604    1608      +4
dc_name                                                -       3      +3
bc_name                                                -       3      +3
applet_names                                        2781    2784      +3
static.bases                                           5       -      -5
check_under                                           20       -     -20
pop                                                   24       -     -24
print_no_pop                                          32       -     -32
sub                                                   34       -     -34
divide                                                34       -     -34
mul                                                   37       -     -37
add                                                   37       -     -37
push                                                  38       -     -38
print_stack_no_pop                                    40       -     -40
not                                                   72       -     -72
set_output_base                                       95       -     -95
or                                                   103       -    -103
eor                                                  103       -    -103
and                                                  103       -    -103
mod                                                  105       -    -105
stack_machine                                        116       -    -116
operators                                            144       -    -144
print_base                                           230       -    -230
------------------------------------------------------------------------------
(add/remove: 173/20 grow/shrink: 4/0 up/down: 38089/-1372)  Total: 36717 bytes
   text    data     bss     dec     hex filename
 950181     485    7296  957962   e9e0a busybox_old
 989722     485    7344  997551   f38af busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: new applet, throws warning
Gavin Howard [Sat, 3 Nov 2018 17:00:21 +0000 (11:00 -0600)]
bc: new applet, throws warning

Signed-off-by: Gavin Howard <yzena.tech@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agovi: correctly detect when a deletion empties the buffer
Ron Yorston [Mon, 3 Dec 2018 09:07:58 +0000 (10:07 +0100)]
vi: correctly detect when a deletion empties the buffer

Michał Berger has reported two issues:

- Repeatedly deleting and undoing the deletion of the last line
  results in characters being lost from the end of the line.

- Deleting the bottom line twice then attempting to undo each of
  these deletions results in a segfault.

The problem seems to be an incorrect test for whether the text buffer
is empty.

Reported-by: Michał Berger <michallinuxstuff@gmail.com>
Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agovi: code shrink
Denys Vlasenko [Thu, 29 Nov 2018 13:39:52 +0000 (14:39 +0100)]
vi: code shrink

function                                             old     new   delta
char_search                                          241     247      +6
get_one_address                                      275     272      -3
colon                                               2878    2875      -3
do_cmd                                              4726    4720      -6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/3 up/down: 6/-12)              Total: -6 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agovi: fix FEATURE_VI_REGEX_SEARCH to respect LIMITED (one-line) search
Denys Vlasenko [Thu, 29 Nov 2018 13:19:57 +0000 (14:19 +0100)]
vi: fix FEATURE_VI_REGEX_SEARCH to respect LIMITED (one-line) search

If busybox is compiled with FEATURE_VI_REGEX_SEARCH enabled, command
":s/x/y/" searches not only in the current line, but continues search
after it. This makes range searches (":1,3s/x/y/") work incorrect. For
example file "./test":
1
2
3

$ vi ./test
:1,2s/3/e/
gives us:
1
2
e

function                                             old     new   delta
char_search                                          213     241     +28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agolibbb: do not misinterpret 0x10-0x19 chars in "\xNNN" too
Denys Vlasenko [Thu, 29 Nov 2018 12:15:57 +0000 (13:15 +0100)]
libbb: do not misinterpret 0x10-0x19 chars in "\xNNN" too

function                                             old     new   delta
bb_process_escape_sequence                           141     151     +10

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agolibbb: @ in "\x3@" is not a valid hex digit
Denys Vlasenko [Thu, 29 Nov 2018 11:34:50 +0000 (12:34 +0100)]
libbb: @ in "\x3@" is not a valid hex digit

function                                             old     new   delta
bb_process_escape_sequence                           134     141      +7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agocat,nl: fix handling of open errors
Denys Vlasenko [Thu, 29 Nov 2018 10:44:10 +0000 (11:44 +0100)]
cat,nl: fix handling of open errors

$ cat -n does_not_exist; echo $?
cat: does_not_exist: No such file or directory
1

function                                             old     new   delta
print_numbered_lines                                 118     129     +11
nl_main                                              196     201      +5
cat_main                                             421     425      +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 20/0)               Total: 20 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoawk: abort if NF set to negative value
Denys Vlasenko [Wed, 28 Nov 2018 11:16:29 +0000 (12:16 +0100)]
awk: abort if NF set to negative value

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotestsuite: check CONFIG_DESKTOP before using 'od -t'
Chen Qi [Wed, 21 Nov 2018 02:19:28 +0000 (10:19 +0800)]
testsuite: check CONFIG_DESKTOP before using 'od -t'

The '-t' option for od is enabled by CONFIG_DESKTOP. So
check this config before using 'od -t' in test cases.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: allow hush to run embedded scripts
Ron Yorston [Tue, 27 Nov 2018 14:34:25 +0000 (14:34 +0000)]
hush: allow hush to run embedded scripts

Embedded scripts require a shell to be present in the BusyBox
binary.  Allow either ash or hush to be used for this purpose.
If both are enabled ash takes precedence.

The size of the binary is unchanged in the default configuration:
both ash and hush are present but support for embedded scripts
isn't compiled into hush.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agofree: ensure there is a least one space between numbers
Denys Vlasenko [Tue, 27 Nov 2018 14:43:10 +0000 (15:43 +0100)]
free: ensure there is a least one space between numbers

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agodocs: add embedded-scripts.txt
Ron Yorston [Tue, 27 Nov 2018 10:45:30 +0000 (10:45 +0000)]
docs: add embedded-scripts.txt

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotar: skip 'V' headers (GNU volume label), closes 11526
Denys Vlasenko [Tue, 27 Nov 2018 11:09:01 +0000 (12:09 +0100)]
tar: skip 'V' headers (GNU volume label), closes 11526

function                                             old     new   delta
get_header_tar                                      1696    1690      -6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agounlzma: fix too-eager corruption check
Denys Vlasenko [Tue, 27 Nov 2018 10:52:14 +0000 (11:52 +0100)]
unlzma: fix too-eager corruption check

function                                             old     new   delta
unpack_lzma_stream                                  2686    2674     -12

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotar: fix too eager autodetection, closes 11531
Denys Vlasenko [Tue, 27 Nov 2018 10:26:48 +0000 (11:26 +0100)]
tar: fix too eager autodetection, closes 11531

function                                             old     new   delta
is_suffixed_with                                       -      54     +54
tar_main                                            1006    1026     +20
open_transformer                                      92      79     -13
config_file_action                                   478     458     -20
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/2 up/down: 74/-33)             Total: 41 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agobuild system: prevent duplicate applet names
Ron Yorston [Sun, 25 Nov 2018 11:46:39 +0000 (11:46 +0000)]
build system: prevent duplicate applet names

The embedded script feature makes it easier to create applets with
duplicate names.  Currently in such cases the build succeeds but
the resulting executable doesn't work as the developer intended.

Catch duplicate names when the applet tables are being generated
and make the build fail.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoTweaks to build process for embedded scripts
Ron Yorston [Wed, 21 Nov 2018 10:11:01 +0000 (10:11 +0000)]
Tweaks to build process for embedded scripts

- Force a rebuild if a script in applets_sh is changed.

- Move the dummy usage messages for custom applets to usage.h and
  change the name from 'dummy' to 'scripted'.

- Hide an error from gen_build_files.sh if an embed directory exists
  but is empty.

- Tidy up embedded_scripts script.

v2: Remove a couple of unnecessary tests in embedded_scripts, as
    pointed out by Xabier Oneca.
    Drop the stripping of comments.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add ECDHE_PSK and remove ARIA cipher ids
Denys Vlasenko [Tue, 27 Nov 2018 09:35:10 +0000 (10:35 +0100)]
tls: add ECDHE_PSK and remove ARIA cipher ids

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add _anon_ cipher definitions
Denys Vlasenko [Mon, 26 Nov 2018 16:33:17 +0000 (17:33 +0100)]
tls: add _anon_ cipher definitions

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: enable TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 cipher
Denys Vlasenko [Mon, 26 Nov 2018 15:39:19 +0000 (16:39 +0100)]
tls: enable TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 cipher

function                                             old     new   delta
static.ciphers                                        30      32      +2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: cipher 009D is not yet supported, don't test for it
Denys Vlasenko [Mon, 26 Nov 2018 15:30:22 +0000 (16:30 +0100)]
tls: cipher 009D is not yet supported, don't test for it

function                                             old     new   delta
tls_handshake                                       2116    2108      -8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: speed up prf_hmac_sha256()
Denys Vlasenko [Mon, 26 Nov 2018 14:55:41 +0000 (15:55 +0100)]
tls: speed up prf_hmac_sha256()

function                                             old     new   delta
hmac_sha_precomputed                                   -      58     +58
prf_hmac_sha256                                      181     222     +41
hmac_sha256                                           68       -     -68
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 1/0 up/down: 99/-68)             Total: 31 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibbb: add comment on sha384
Denys Vlasenko [Mon, 26 Nov 2018 12:00:28 +0000 (13:00 +0100)]
libbb: add comment on sha384

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: simplify hmac_begin()
Denys Vlasenko [Mon, 26 Nov 2018 09:33:23 +0000 (10:33 +0100)]
tls: simplify hmac_begin()

function                                             old     new   delta
hmac_begin                                           196     158     -38

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add support for 8 more cipher ids - all tested to work
Denys Vlasenko [Sun, 25 Nov 2018 23:17:10 +0000 (00:17 +0100)]
tls: add support for 8 more cipher ids - all tested to work

function                                             old     new   delta
tls_handshake                                       2059    2116     +57
static.ciphers                                         -      30     +30
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/0 up/down: 87/0)               Total: 87 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: fix comments
Denys Vlasenko [Sun, 25 Nov 2018 17:52:47 +0000 (18:52 +0100)]
tls: fix comments

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add a comment on expanding list of supported ciphers
Denys Vlasenko [Sun, 25 Nov 2018 16:27:48 +0000 (17:27 +0100)]
tls: add a comment on expanding list of supported ciphers

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: do not leak RSA key
Denys Vlasenko [Sun, 25 Nov 2018 15:17:26 +0000 (16:17 +0100)]
tls: do not leak RSA key

function                                             old     new   delta
tls_handshake                                       1957    2059    +102

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Sun, 25 Nov 2018 13:45:55 +0000 (14:45 +0100)]
tls: code shrink

function                                             old     new   delta
xwrite_and_update_handshake_hash                      81      80      -1
tls_handshake                                       1987    1957     -30

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Sun, 25 Nov 2018 13:28:32 +0000 (14:28 +0100)]
tls: code shrink

function                                             old     new   delta
tls_handshake                                       1993    1987      -6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Sun, 25 Nov 2018 13:03:59 +0000 (14:03 +0100)]
tls: code shrink

function                                             old     new   delta
aesgcm_GHASH                                         223     196     -27

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: on x86, use xorbuf_aligned_AES_BLOCK_SIZE() even with non-aligned source
Denys Vlasenko [Sun, 25 Nov 2018 11:01:44 +0000 (12:01 +0100)]
tls: on x86, use xorbuf_aligned_AES_BLOCK_SIZE() even with non-aligned source

function                                             old     new   delta
aesgcm_GHASH                                         228     223      -5

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: actually fill in CIPHER_ID3 value in hello message
Denys Vlasenko [Sat, 24 Nov 2018 23:53:19 +0000 (00:53 +0100)]
tls: actually fill in CIPHER_ID3 value in hello message

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agontpd: do not SEGV on "-p keyno:192.168.1.1", show --help instead
Denys Vlasenko [Sat, 24 Nov 2018 23:42:56 +0000 (00:42 +0100)]
ntpd: do not SEGV on "-p keyno:192.168.1.1", show --help instead

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agowget: code shrink
Denys Vlasenko [Sat, 24 Nov 2018 20:56:21 +0000 (21:56 +0100)]
wget: code shrink

function                                             old     new   delta
base64enc                                             53      46      -7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: fix is.gd again, fix AES-CBC using decrypt key instead of encrypt
Denys Vlasenko [Sat, 24 Nov 2018 20:26:20 +0000 (21:26 +0100)]
tls: fix is.gd again, fix AES-CBC using decrypt key instead of encrypt

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: speed up xor'ing of aligned 16-byte buffers
Denys Vlasenko [Sat, 24 Nov 2018 13:08:29 +0000 (14:08 +0100)]
tls: speed up xor'ing of aligned 16-byte buffers

function                                             old     new   delta
xorbuf_aligned_AES_BLOCK_SIZE                          -      23     +23
xwrite_encrypted                                     585     580      -5
aesgcm_GHASH                                         233     228      -5
GMULT                                                192     187      -5
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/3 up/down: 23/-15)              Total: 8 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: in AES-GCM decoding, avoid memmove
Denys Vlasenko [Sat, 24 Nov 2018 12:51:46 +0000 (13:51 +0100)]
tls: in AES-GCM decoding, avoid memmove

function                                             old     new   delta
xorbuf3                                                -      36     +36
xorbuf                                                24      12     -12
tls_xread_record                                     656     634     -22
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 36/-34)              Total: 2 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: fix a thinko in GHASH optimization
Denys Vlasenko [Sat, 24 Nov 2018 12:47:44 +0000 (13:47 +0100)]
tls: fix a thinko in GHASH optimization

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: make tls_get_random() FAST_FUNC
Denys Vlasenko [Fri, 23 Nov 2018 18:24:57 +0000 (19:24 +0100)]
tls: make tls_get_random() FAST_FUNC

function                                             old     new   delta
tls_handshake                                       1977    1985      +8
tls_get_random                                        32      28      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 8/-4)                Total: 4 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agowget: print the final newline only for non-tty output
Denys Vlasenko [Fri, 23 Nov 2018 18:14:52 +0000 (19:14 +0100)]
wget: print the final newline only for non-tty output

$ busybox wget URL 2>&1 | cat
Connecting to ....
install.iso          0% |                                | 2629k  0:02:05 ETA
install.iso          7% |**                              | 25.7M  0:00:23 ETA
install.iso         16% |*****                           | 54.1M  0:00:14 ETA
install.iso         20% |******                          | 67.4M  0:00:15 ETA
install.iso         25% |********                        | 81.0M  0:00:14 ETA
install.iso         30% |*********                       | 97.3M  0:00:13 ETA
install.iso         36% |***********                     |  117M  0:00:12 ETA
install.iso         41% |*************                   |  134M  0:00:11 ETA
install.iso         47% |***************                 |  152M  0:00:10 ETA
install.iso         54% |*****************               |  176M  0:00:08 ETA
install.iso         61% |*******************             |  200M  0:00:06 ETA
install.iso         66% |*********************           |  215M  0:00:06 ETA
install.iso         71% |**********************          |  231M  0:00:05 ETA
install.iso         75% |************************        |  244M  0:00:04 ETA
install.iso         79% |*************************       |  257M  0:00:03 ETA
install.iso         84% |***************************     |  275M  0:00:02 ETA
install.iso         91% |*****************************   |  297M  0:00:01 ETA
install.iso         99% |******************************* |  321M  0:00:00 ETA
install.iso        100% |********************************|  323M  0:00:00 ETA
  <-- no empty line here
$

function                                             old     new   delta
bb_progress_update                                   622     632     +10
progress_meter                                       152     158      +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 16/0)               Total: 16 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Fri, 23 Nov 2018 18:07:05 +0000 (19:07 +0100)]
tls: code shrink

function                                             old     new   delta
aesgcm_GHASH                                         262     233     -29

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: typo fix in comment
Denys Vlasenko [Fri, 23 Nov 2018 18:00:12 +0000 (19:00 +0100)]
tls: typo fix in comment

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: make local buffers in aesgcm_GHASH() explicitly 32-bit aligned
Denys Vlasenko [Fri, 23 Nov 2018 17:55:15 +0000 (18:55 +0100)]
tls: make local buffers in aesgcm_GHASH() explicitly 32-bit aligned

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Fri, 23 Nov 2018 17:48:20 +0000 (18:48 +0100)]
tls: code shrink

function                                             old     new   delta
xwrite_encrypted                                     599     585     -14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: simplify aesgcm_GHASH()
Denys Vlasenko [Fri, 23 Nov 2018 17:31:26 +0000 (18:31 +0100)]
tls: simplify aesgcm_GHASH()

function                                             old     new   delta
xwrite_encrypted                                     604     599      -5
FlattenSzInBits                                       52       -     -52
aesgcm_GHASH                                         395     262    -133
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/2 up/down: 0/-190)           Total: -190 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: in AES-CBC code, do not set key for every record - do it once
Denys Vlasenko [Fri, 23 Nov 2018 17:02:44 +0000 (18:02 +0100)]
tls: in AES-CBC code, do not set key for every record - do it once

function                                             old     new   delta
aes_setkey                                            16     212    +196
tls_handshake                                       1941    1977     +36
aes_encrypt_1                                        382     396     +14
xwrite_encrypted                                     605     604      -1
tls_xread_record                                     659     656      -3
aes_encrypt_one_block                                 65      59      -6
aes_cbc_encrypt                                      172     121     -51
aesgcm_setkey                                         58       -     -58
aes_cbc_decrypt                                      958     881     -77
KeyExpansion                                         188       -    -188
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 3/5 up/down: 246/-384)         Total: -138 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add support for TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 cipher
Denys Vlasenko [Fri, 23 Nov 2018 16:21:38 +0000 (17:21 +0100)]
tls: add support for TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 cipher

function                                             old     new   delta
xwrite_encrypted                                     209     605    +396
GHASH                                                  -     395    +395
aes_encrypt_1                                          -     382    +382
GMULT                                                  -     192    +192
tls_xread_record                                     489     659    +170
aes_encrypt_one_block                                  -      65     +65
aesgcm_setkey                                          -      58     +58
FlattenSzInBits                                        -      52     +52
tls_handshake                                       1890    1941     +51
xwrite_and_update_handshake_hash                      46      81     +35
xorbuf                                                 -      24     +24
aes_setkey                                             -      16     +16
psRsaEncryptPub                                      413     421      +8
stty_main                                           1221    1227      +6
ssl_client_main                                      138     143      +5
next_token                                           841     845      +4
spawn_ssl_client                                     218     219      +1
volume_id_probe_hfs_hfsplus                          564     563      -1
read_package_field                                   232     230      -2
i2cdetect_main                                       674     672      -2
fail_hunk                                            139     136      -3
parse_expr                                           891     883      -8
curve25519                                           802     793      -9
aes_cbc_decrypt                                      971     958     -13
xwrite_handshake_record                               43       -     -43
aes_cbc_encrypt                                      644     172    -472
------------------------------------------------------------------------------
(add/remove: 9/1 grow/shrink: 9/8 up/down: 1860/-553)        Total: 1307 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: reset tokpushback before prompting while parsing heredoc
Christoph Schulz [Tue, 20 Nov 2018 16:45:52 +0000 (17:45 +0100)]
ash: reset tokpushback before prompting while parsing heredoc

The parser reads from an already freed memory location, thereby causing
unpredictable results, in the following situation:

- ENABLE_ASH_EXPAND_PRMT is enabled
- heredoc is being parsed
- command substitution is used within heredoc

Examples where this bug crops up are (PS2 is set to "> "):

$ cat <<EOF
> `echo abc`
> EOF
-sh: O: not found

$ cat <<EOF
> $(echo abc)
> EOF
-sh: {garbage}: not found

The presumable reason is that setprompt_if() causes a nested expansion when
ENABLE_ASH_EXPAND_PRMT is enabled, therefore leaving "wordtext" in an unusable
state. However, when parseheredoc() is called, "tokpushback" is non-zero, which
causes the next call to xxreadtoken() to return TWORD, causing the caller to
use the invalid "wordtoken" instead of reading the next valid token.

The call chain is:

list()
-> peektoken() [sets tokpushback to 1]
-> parseheredoc()
   -> setprompt_if()
      -> pushstackmark()
      -> expandstr()
         -> readtoken1()
            [sets lasttoken to TWORD, wordtoken points to expanded prompt]
      -> popstackmark() [invalidates wordtoken, leaves lasttoken as is]
   -> readtoken1()
      -> ...parsebackq
         -> list()
            -> andor()
               -> pipeline()
                  -> readtoken()
                     -> xxreadtoken()
                        [tokpushback non-zero, reuse lasttoken and wordtext]

Note that in almost all other contexts, each call to setprompt_if() is preceded
by setting "tokpushback" to zero. One exception is "oldstyle" backquote parsing
in readtoken1(), but there "tokpushback" is reset afterwards. The other
exception is nlprompt(), but this function is only used within readtoken1()
(but in contexts where no nested calls to xxreadtoken() occur) and xxreadtoken()
(where "tokpushback" is guaranteed to be zero).

function                                             old     new   delta
parseheredoc                                         124     131      +7

Signed-off-by: Christoph Schulz <develop@kristov.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoscripts/trylink: be more clever when deciding that "lib elimination" has finished:
Denys Vlasenko [Mon, 19 Nov 2018 19:36:16 +0000 (20:36 +0100)]
scripts/trylink: be more clever when deciding that "lib elimination" has finished:

Before:
Trying libraries: crypt m resolv
 Library crypt is not needed, excluding it
 Library m is needed, can't exclude it (yet)
 Library resolv is needed, can't exclude it (yet)
 Library m is needed, can't exclude it (yet)
 Library resolv is needed, can't exclude it (yet)
Final link with: m resolv

After:
Trying libraries: crypt m resolv
 Library crypt is not needed, excluding it
 Library m is needed, can't exclude it (yet)
 Library resolv is needed, can't exclude it (yet)
Final link with: m resolv

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add comment, no code changes
Denys Vlasenko [Sun, 18 Nov 2018 18:50:24 +0000 (19:50 +0100)]
tls: add comment, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoEnsure build works when KBUILD_OUTPUT is set, closes 11511
Ron Yorston [Sun, 18 Nov 2018 07:40:40 +0000 (07:40 +0000)]
Ensure build works when KBUILD_OUTPUT is set, closes 11511

The build process for embedded scripts didn't have consistent
support for saving output to a different directory.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agobusybox: add '--show SCRIPT' option to display scripts
Ron Yorston [Sun, 18 Nov 2018 18:12:26 +0000 (19:12 +0100)]
busybox: add '--show SCRIPT' option to display scripts

Add an option to allow the content of embedded scripts to be
displayed.  This includes applet scripts, custom scripts and the
.profile script.

function                                             old     new   delta
busybox_main                                         624     701     +77
find_script_by_name                                    -      24     +24
scripted_main                                         41      35      -6
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 101/-6)             Total: 95 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoTreat custom and applet scripts as applets
Ron Yorston [Sat, 17 Nov 2018 17:48:14 +0000 (17:48 +0000)]
Treat custom and applet scripts as applets

BusyBox has support for embedded shell scripts.  Two types can be
distinguished:  custom scripts and scripts implementing applets.

Custom scripts should be placed in the 'embed' directory at build
time.  They are given a default applet configuration and appear
as applets to the user but no further configuration is possible.

Applet scripts are integrated with the BusyBox build system and
are intended to be used to ship standard applets that just happen
to be implemented as scripts.  They can be configured at build time
and appear just like native applets.

Such scripts should be placed in the 'applets_sh' directory.  A stub
C program should be written to provide the usual applet configuration
details and placed in a suitable subsystem directory.  It may be
helpful to have a configuration option to enable any dependencies the
script requires:  see the 'nologin' applet for an example.

function                                             old     new   delta
scripted_main                                          -      41     +41
applet_names                                        2773    2781      +8
applet_main                                         1600    1604      +4
i2cdetect_main                                       672     674      +2
applet_suid                                          100     101      +1
applet_install_loc                                   200     201      +1
applet_flags                                         100     101      +1
packed_usage                                       33180   33179      -1
tryexec                                              159     152      -7
evalcommand                                         1661    1653      -8
script_names                                           9       -      -9
packed_scripts                                       123     114      -9
complete_cmd_dir_file                                826     811     -15
shellexec                                            271     254     -17
find_command                                        1007     990     -17
busybox_main                                         642     624     -18
run_applet_and_exit                                  100      78     -22
find_script_by_name                                   51       -     -51
------------------------------------------------------------------------------
(add/remove: 1/2 grow/shrink: 6/9 up/down: 58/-174)          Total: -116 bytes
   text    data     bss     dec     hex filename
 950034     477    7296  957807   e9d6f busybox_old
 949918     477    7296  957691   e9cfb busybox_unstripped

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: ensure variables are fully initialised when unset
Ron Yorston [Mon, 12 Nov 2018 21:10:54 +0000 (21:10 +0000)]
ash: ensure variables are fully initialised when unset

When a variable is unset by calling setvar(name, NULL, 0) the code
to initialise the new, empty variable fails to initialise the last
character of the string.

Attempts to read the contents of the unset variable will result
in the uninitialised character at the end of the string being
accessed.

For example, running BusyBox under Valgrind and unsetting PATH:

$ valgrind ./busybox_unstripped sh
==21249== Memcheck, a memory error detector
==21249== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==21249== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==21249== Command: ./busybox_unstripped sh
==21249==
/data2/git/build_fix_8721 $ unset PATH
/data2/git/build_fix_8721 $ 0
==21249== Conditional jump or move depends on uninitialised value(s)
==21249==    at 0x451371: path_advance (ash.c:2555)
==21249==    by 0x456E22: find_command (ash.c:13407)
==21249==    by 0x458425: evalcommand (ash.c:10139)
==21249==    by 0x454CBC: evaltree (ash.c:9131)
==21249==    by 0x456C80: cmdloop (ash.c:13164)

Closes https://bugs.busybox.net/show_bug.cgi?id=8721

v2: On the dash mailing list Harald van Dijk was kind enough to point
    out a flaw in my reasoning and provide an alternative patch.  Sadly
    his patch adds 2 bytes of bloat.  Using xzalloc to zero the whole
    string gives a bloat of -3 bytes.

function                                             old     new   delta
setvar                                               172     169      -3

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: correct description for HUSH_TICK config option
Ron Yorston [Fri, 9 Nov 2018 12:00:39 +0000 (12:00 +0000)]
hush: correct description for HUSH_TICK config option

The HUSH_TICK configuration option enables command substitution,
not process substitution.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Wed, 14 Nov 2018 10:35:36 +0000 (11:35 +0100)]
tls: code shrink

function                                             old     new   delta
spawn_ssl_client                                     219     218      -1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agowget: print "TLS certificate validation not implemented" only once on redirects
Denys Vlasenko [Tue, 13 Nov 2018 11:00:19 +0000 (12:00 +0100)]
wget: print "TLS certificate validation not implemented" only once on redirects

function                                             old     new   delta
spawn_ssl_client                                     209     219     +10

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Tue, 13 Nov 2018 10:58:53 +0000 (11:58 +0100)]
tls: code shrink

function                                             old     new   delta
tls_get_zeroed_outbuf                                  -      28     +28
static.empty_client_cert                               7       -      -7
tls_handshake                                       1930    1890     -40
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 0/1 up/down: 28/-47)            Total: -19 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: tidy up recently added ECDSA code
Denys Vlasenko [Tue, 13 Nov 2018 10:44:32 +0000 (11:44 +0100)]
tls: tidy up recently added ECDSA code

function                                             old     new   delta
tls_handshake                                       1935    1930      -5
static.OID_ECDSA_KEY_ALG                              21      11     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-15)             Total: -15 bytes
   text    data     bss     dec     hex filename
 950036     477    7296  957809   e9d71 busybox_old
 950048     477    7296  957821   e9d7d busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Tue, 13 Nov 2018 02:15:15 +0000 (03:15 +0100)]
tls: code shrink

function                                             old     new   delta
static.f25519_one                                     32       -     -32
curve25519                                           835     802     -33
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-65)             Total: -65 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add support for ECDHE-ECDSA-AES-128-CBC-SHA and x25519 curve
Denys Vlasenko [Tue, 13 Nov 2018 01:16:24 +0000 (02:16 +0100)]
tls: add support for ECDHE-ECDSA-AES-128-CBC-SHA and x25519 curve

function                                             old     new   delta
curve25519                                             -     835    +835
tls_handshake                                       1619    1935    +316
xc_diffadd                                             -     230    +230
fe_mul__distinct                                       -     149    +149
lm_sub                                                 -     103    +103
lm_add                                                 -      82     +82
fe_mul_c                                               -      74     +74
fe_select                                              -      45     +45
static.f25519_one                                      -      32     +32
static.basepoint9                                      -      32     +32
static.OID_ECDSA_KEY_ALG                               -      21     +21
static.OID_RSA_KEY_ALG                                 -      13     +13
static.supported_groups                                -       8      +8
static.empty_client_cert                               -       7      +7
der_binary_to_pstm                                    40      42      +2
static.expected                                       13       -     -13
------------------------------------------------------------------------------
(add/remove: 14/1 grow/shrink: 2/0 up/down: 1949/-13)        Total: 1936 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: minor fixes
Ron Yorston [Mon, 5 Nov 2018 13:13:08 +0000 (13:13 +0000)]
ash: minor fixes

Ensure that login_sh is initialised in procargs even when running
an embedded script.

The argc argument to ash_main isn't unused when embedded scripts
are present.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: code shrink
Denys Vlasenko [Sun, 4 Nov 2018 23:18:18 +0000 (00:18 +0100)]
tls: code shrink

function                                             old     new   delta
tls_handshake                                       1643    1619     -24

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: reorder a few more cipher ids
Denys Vlasenko [Sun, 4 Nov 2018 20:25:41 +0000 (21:25 +0100)]
tls: reorder a few more cipher ids

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: move TLS_AES_128_GCM_SHA256 definition up
Denys Vlasenko [Sun, 4 Nov 2018 20:18:29 +0000 (21:18 +0100)]
tls: move TLS_AES_128_GCM_SHA256 definition up

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotls: add more cipher ids, no code changes
Denys Vlasenko [Sun, 4 Nov 2018 19:53:54 +0000 (20:53 +0100)]
tls: add more cipher ids, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoudhcpc: code shrink
Denys Vlasenko [Sat, 3 Nov 2018 22:34:03 +0000 (23:34 +0100)]
udhcpc: code shrink

function                                             old     new   delta
perform_release                                      112     172     +60
send_release                                          81       -     -81
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/0 up/down: 60/-81)            Total: -21 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoremove FAST_FUNC on a static function
Denys Vlasenko [Fri, 2 Nov 2018 13:20:54 +0000 (14:20 +0100)]
remove FAST_FUNC on a static function

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoscripts/embedded_scripts: do not add superfluous NUL to script_names[]
Denys Vlasenko [Fri, 2 Nov 2018 13:18:36 +0000 (14:18 +0100)]
scripts/embedded_scripts: do not add superfluous NUL to script_names[]

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibarchive: add a function to unpack embedded data
Ron Yorston [Fri, 2 Nov 2018 13:14:31 +0000 (14:14 +0100)]
libarchive: add a function to unpack embedded data

Similar code to unpack embedded data is used to decompress usage
messages, embedded scripts and the config file (in the non-default
bbconfig applet).

Moving this code to a common function reduces the size of the default
build and hides more of the internals of libarchive.

function                                             old     new   delta
unpack_bz2_data                                        -     135    +135
bb_show_usage                                        137     157     +20
get_script_content                                    32      47     +15
unpack_scripts                                       119       -    -119
unpack_usage_messages                                124       -    -124
------------------------------------------------------------------------------
(add/remove: 1/2 grow/shrink: 2/0 up/down: 170/-243)          Total: -73 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosvlogd: fix pattern matching when using timestamps
Denys Vlasenko [Thu, 1 Nov 2018 13:53:04 +0000 (14:53 +0100)]
svlogd: fix pattern matching when using timestamps

function                                             old     new   delta
svlogd_main                                         1488    1496      +8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agobusybox: show embedded scripts in applet list
Denys Vlasenko [Thu, 1 Nov 2018 12:58:16 +0000 (13:58 +0100)]
busybox: show embedded scripts in applet list

function                                             old     new   delta
busybox_main                                         624     642     +18

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolineedit: autocompletion for embedded scripts
Ron Yorston [Thu, 1 Nov 2018 11:51:10 +0000 (12:51 +0100)]
lineedit: autocompletion for embedded scripts

function                                             old     new   delta
complete_cmd_dir_file                                811     826     +15

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>