oweals/busybox.git
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>
6 years agoash: fix thinko in last commit
Denys Vlasenko [Thu, 1 Nov 2018 11:50:33 +0000 (12:50 +0100)]
ash: fix thinko in last commit

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: in tryexec(), ensure we don't try to run embedded scripts as applets
Ron Yorston [Thu, 1 Nov 2018 10:45:03 +0000 (11:45 +0100)]
ash: in tryexec(), ensure we don't try to run embedded scripts as applets

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: recognize embedded scripts in SH_STANDALONE mode
Ron Yorston [Thu, 1 Nov 2018 10:04:47 +0000 (11:04 +0100)]
ash: recognize embedded scripts in SH_STANDALONE mode

function                                             old     new   delta
find_script_by_name                                    -      51     +51
shellexec                                            254     271     +17
find_command                                         990    1007     +17
evalcommand                                         1653    1661      +8
doCommands                                          2233    2222     -11
run_applet_and_exit                                  128     100     -28
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 6/4 up/down: 104/-52)            Total: 52 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoclaenups for previous commit
Denys Vlasenko [Thu, 1 Nov 2018 09:28:04 +0000 (10:28 +0100)]
claenups for previous commit

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: allow shell scripts to be embedded in the binary
Denys Vlasenko [Thu, 1 Nov 2018 08:53:25 +0000 (09:53 +0100)]
ash: allow shell scripts to be embedded in the binary

To assist in the deployment of shell scripts it may be convenient
to embed them in the BusyBox binary.

'Embed scripts in the binary' takes any files in the directory
'embed', concatenates them with null separators, compresses them
and embeds them in the binary.

When scripts are embedded in the binary, scripts can be run as
'busybox SCRIPT [ARGS]' or by usual (sym)link mechanism.

embed/nologin is provided as an example.

function                                             old     new   delta
packed_scripts                                         -     123    +123
unpack_scripts                                         -      87     +87
ash_main                                            1103    1171     +68
run_applet_and_exit                                   78     128     +50
get_script_content                                     -      32     +32
script_names                                           -      10     +10
expmeta                                              663     659      -4
------------------------------------------------------------------------------
(add/remove: 4/0 grow/shrink: 2/1 up/down: 370/-4)            Total: 366 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agovi: remove duplicated code
Ron Yorston [Tue, 26 Apr 2016 14:23:38 +0000 (15:23 +0100)]
vi: remove duplicated code

At worst show_status_line() might be called needlessly when the
user presses ^L/^R, but I don't think we'll get many complaints
about that.

function                                             old     new   delta
do_cmd                                              4592    4558     -34
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-34)             Total: -34 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibbb/u_signal_names.c: don't check errno after bb_strtou
Rasmus Villemoes [Wed, 12 Sep 2018 14:06:37 +0000 (16:06 +0200)]
libbb/u_signal_names.c: don't check errno after bb_strtou

Since we're comparing the return value to a smallish integer anyway, we
might as well use that bb_strtou() returns UINT_MAX for malformed
input. Referencing errno is kinda bloaty on glibc.

While NSIG is not in POSIX, we do already rely on it being defined,
compile-time const and smallish, since arrays in struct globals_misc are
defined in terms of it.

function                                             old     new   delta
get_signum                                           312     286     -26

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibbb: optionally honour libc provided SIGRTMIN/SIGRTMAX in get_signum()
Rasmus Villemoes [Wed, 12 Sep 2018 14:06:36 +0000 (16:06 +0200)]
libbb: optionally honour libc provided SIGRTMIN/SIGRTMAX in get_signum()

When an application documents that it responds such and such to
SIGRTMIN+n, that almost always means with respect to the libc-provided
SIGRTMIN. Hence I disagree with the "more correct" in commit
7b276fc17594. In any case, this is rather unfortunate:

36
34

(the first shell is bash). We probably can't change default behaviour
after 7 years, but at least we can provide a config option.

We avoid a little code generation (repeated calls to
__libc_current_sigrtmin) by stashing SIGRTMIN/SIGRTMAX in local
variables, but it does cost ~50 bytes. The next patch serves as penance
for that.

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoprintf: fix printf "%u\n" +18446744073709551614
Denys Vlasenko [Tue, 30 Oct 2018 22:24:18 +0000 (23:24 +0100)]
printf: fix printf "%u\n" +18446744073709551614

function                                             old     new   delta
conv_strtoll                                          19      32     +13
conv_strtoull                                         49      61     +12
bb_strtoll                                            89      84      -5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 25/-5)              Total: 20 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agontpd: default to FEATURE_NTP_AUTH=y
Denys Vlasenko [Tue, 30 Oct 2018 22:07:26 +0000 (23:07 +0100)]
ntpd: default to FEATURE_NTP_AUTH=y

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agodd: do not have 'ocount' variable if ibs/obs support is not enabled
Denys Vlasenko [Tue, 30 Oct 2018 16:04:52 +0000 (17:04 +0100)]
dd: do not have 'ocount' variable if ibs/obs support is not enabled

function                                             old     new   delta
packed_usage                                       32964   32961      -3
dd_main                                             1033    1021     -12
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-15)             Total: -15 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agodd: add 'oflag=seek_bytes'
Rostislav Skudnov [Mon, 15 Oct 2018 10:26:15 +0000 (10:26 +0000)]
dd: add 'oflag=seek_bytes'

Allow specifying position in the output file in bytes instead of
obs-sized blocks, improve compatibility with GNU dd.

function                                             old     new   delta
dd_main                                             1632    1693     +61
packed_usage                                       33130   33150     +20
static.oflag_words                                     -      12     +12
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/0 up/down: 93/0)               Total: 93 bytes

Signed-off-by: Rostislav Skudnov <rostislav@tuxera.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoxargs: fix exit code if command exits nonzero, closes 11381
Denys Vlasenko [Tue, 30 Oct 2018 13:40:17 +0000 (14:40 +0100)]
xargs: fix exit code if command exits nonzero, closes 11381

No code size change on x86.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agofree: add 'available' memory if provided by the kernel
Guillermo Rodriguez [Tue, 30 Oct 2018 12:49:51 +0000 (13:49 +0100)]
free: add 'available' memory if provided by the kernel

Show estimated available memory if this is provided by the
kernel. See [1] for the full story.

 [1]: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

function                                             old     new   delta
free_main                                            537     633     +96
parse_cached_kb                                       85       -     -85
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/0 up/down: 96/-85)             Total: 11 bytes

Signed-off-by: Guillermo Rodriguez <guille.rodriguez@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoexamples/udhcp/simple.script: add possibility to use modern "ip"
Jiří Prchal [Thu, 4 Oct 2018 07:02:27 +0000 (09:02 +0200)]
examples/udhcp/simple.script: add possibility to use modern "ip"

Script uses "ifconfig" only, not up-to-date so much.
This patch adds "ip" in condition if exists.

Signed-off-by: Jiří Prchal <jiri.prchal@aksignal.cz>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoudhcpc: ensure at least one unicast renew attempt
Denys Vlasenko [Tue, 30 Oct 2018 10:56:18 +0000 (11:56 +0100)]
udhcpc: ensure at least one unicast renew attempt

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agontpd: add support for MD5/SHA1 message authentication
Brandon P. Enochs [Sat, 27 Oct 2018 16:55:59 +0000 (18:55 +0200)]
ntpd: add support for MD5/SHA1 message authentication

Add support for MD5 message authentication as described in RFC 5905.
This patch also supports SHA1 authentication.

The key file format is the same file format as used by ntpd.
The configuration file format follows standard Unix conventions
(# comments) with lines consist of the following fields separated by whitespace:
<key identifier, [1,65535]> <SHA1|MD5> <an ASCII string of up to 20 characters|an octet string [a-zA-F0-9] of up to 40 characters>.

https://www.ietf.org/rfc/rfc5905.txt

function                                             old     new   delta
ntp_init                                             473     987    +514
hash                                                   -     125    +125
recv_and_process_peer_pkt                            889     961     +72
packed_usage                                       33066   33130     +64
ntpd_main                                           1226    1277     +51
find_key_entry                                         -      29     +29
add_peers                                            195     207     +12
recv_and_process_client_pkt                          509     514      +5
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 6/0 up/down: 872/0)             Total: 872 bytes

Signed-off-by: Brandon P. Enochs <enochs.brandon@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agonbd-client: support newstyle protocol, -b, -d, -p, -N
Denys Vlasenko [Wed, 24 Oct 2018 13:51:38 +0000 (15:51 +0200)]
nbd-client: support newstyle protocol, -b, -d, -p, -N

Recognize the "newstyle" protocol and switch to it automatically.
Add options for setting blocksize (-b) and for disconnecting
a nbd device (-d).

function                                             old     new   delta
nbdclient_main                                       492    1179    +687
static.long_options                                    -      80     +80
print_direc                                          438     457     +19
brctl_main                                          1169    1183     +14
bb_strtoll                                            84      89      +5
packed_usage                                       33082   33066     -16
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 4/1 up/down: 805/-16)           Total: 789 bytes

Signed-off-by: Elvira Khabirova <lineprinter@altlinux.org>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoprintf: fix printing +-prefixed numbers
Bernhard Reutner-Fischer [Fri, 19 Oct 2018 13:25:41 +0000 (15:25 +0200)]
printf: fix printing +-prefixed numbers

Thanks to Cristian Ionescu-Idbohrn for noticing.

Also fix "%d" '  42' to skip leading whitespace.

function                                             old     new   delta
print_direc                                          435     454     +19
bb_strtoll                                            99     103      +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 23/0)               Total: 23 bytes

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
6 years agobrctl: use a single buffer for brname and ifname
Bernhard Reutner-Fischer [Fri, 2 Mar 2018 16:39:36 +0000 (17:39 +0100)]
brctl: use a single buffer for brname and ifname

function                                             old     new   delta
brctl_main                                          1681    1675      -6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-6)               Total: -6 bytes

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
6 years agounzip: use printable_string() for printing filenames
Denys Vlasenko [Sun, 30 Sep 2018 14:56:56 +0000 (16:56 +0200)]
unzip: use printable_string() for printing filenames

function                                             old     new   delta
unzip_main                                          2726    2792     +66
printable_string2                                      -      57     +57
identify                                            4329    4336      +7
expmeta                                              659     663      +4
add_interface                                         99     103      +4
beep_main                                            286     289      +3
changepath                                           192     194      +2
builtin_type                                         115     117      +2
devmem_main                                          469     470      +1
input_tab                                           1076    1074      -2
create_J                                            1821    1819      -2
poplocalvars                                         314     311      -3
doCommands                                          2222    2214      -8
do_load                                              918     902     -16
printable_string                                      57       9     -48
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 8/6 up/down: 146/-79)            Total: 67 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoifupdown: support "source-directory" stanza
Brandon Maier [Fri, 21 Sep 2018 17:54:05 +0000 (12:54 -0500)]
ifupdown: support "source-directory" stanza

Support the "source-directory" stanza from ifupdown[1]. source-directory
will include all files in the named directory. Similar to the Busybox
version of the "source" stanza, this version of source-directory does
not currently support shell wildcards.

We only check that the stanza starts with "source-dir" as ifupdown does[2].

[1] https://manpages.debian.org/stretch/ifupdown/interfaces.5.en.html#INCLUDING_OTHER_FILES
[2] https://salsa.debian.org/debian/ifupdown/blob/0.8.33/config.c#L498

function                                             old     new   delta
read_interfaces                                     1150    1241     +91

Signed-off-by: Brandon Maier <brandon.maier@rockwellcollins.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agomove storage helpers to libbb.h
Denys Vlasenko [Fri, 28 Sep 2018 13:13:04 +0000 (15:13 +0200)]
move storage helpers to libbb.h

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoudhcpc: give SIGUSR1-induced renew one chance of unicast renew
Denys Vlasenko [Fri, 28 Sep 2018 12:44:09 +0000 (14:44 +0200)]
udhcpc: give SIGUSR1-induced renew one chance of unicast renew

The caps were inconsistent: timeout to renew was capped at 20 seconds,
and any renews with timeout <= 60 seconds were forced to broadcast.

function                                             old     new   delta
udhcpc_main                                         2683    2680      -3

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years ago.gitignore: add ctags output files
Martin Kaiser [Mon, 24 Sep 2018 19:00:47 +0000 (21:00 +0200)]
.gitignore: add ctags output files

Exuberant ctags creates an output file called "tags" by default or
"TAGS" when it's run in emacs mode. Add those two files to .gitignore so
they won't be removed by git clean -df.

Signed-off-by: Martin Kaiser <martin@kaiser.cx>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agomdev.txt: explain the meaning of a leading "-"
Martin Kaiser [Mon, 24 Sep 2018 19:01:51 +0000 (21:01 +0200)]
mdev.txt: explain the meaning of a leading "-"

If a line in mdev.conf starts with "-", parsing will continue even if
a match is found in that line.

Signed-off-by: Martin Kaiser <martin@kaiser.cx>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosed: fix double-free in FEATURE_CLEAN_UP code
Denys Vlasenko [Tue, 25 Sep 2018 10:50:54 +0000 (12:50 +0200)]
sed: fix double-free in FEATURE_CLEAN_UP code

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agodate: do not allow "month #20" and such, closes 11356
Denys Vlasenko [Sun, 23 Sep 2018 18:27:32 +0000 (20:27 +0200)]
date: do not allow "month #20" and such, closes 11356

function                                             old     new   delta
parse_datestr                                        906     961     +55

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohead: convert existing tests to new-style
Thomas De Schampheleire [Thu, 13 Sep 2018 13:01:46 +0000 (15:01 +0200)]
head: convert existing tests to new-style

Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohead: add test case for negative -n invocation
Thomas De Schampheleire [Thu, 13 Sep 2018 13:01:45 +0000 (15:01 +0200)]
head: add test case for negative -n invocation

Commit 2da9724b56169f00bd7fb6b9a11c9409a7620981 broke 'head -n -1' and was
later reverted with 0d598ab9f03dbf320f7b81c05e4a94cb303dfbc7.

This commit adds a test case to avoid future breakage.

Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoinit: hopefully fix "rebooting" in containers
Denys Vlasenko [Sat, 22 Sep 2018 17:30:40 +0000 (19:30 +0200)]
init: hopefully fix "rebooting" in containers

function                                             old     new   delta
pause_and_low_level_reboot                            48      57      +9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agontpd: more verbose message for "root distance too high" case
Denys Vlasenko [Thu, 13 Sep 2018 10:15:36 +0000 (12:15 +0200)]
ntpd: more verbose message for "root distance too high" case

Managed to make ntpd on one of my machines to be stuck getting
"root distance too high" all the time, but log is not giving me
more informatin what exactly is happening...

function                                             old     new   delta
select_and_cluster                                  1045    1095     +50

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoremove_file: don't call rmdir if remove_file return failure
Chen Yu [Tue, 4 Sep 2018 07:26:22 +0000 (15:26 +0800)]
remove_file: don't call rmdir if remove_file return failure

When deleting a directory, the directory should not be removed if the
file in the subdirectory fails to be deleted.

Background information:

When I tested the kernel using LTP (linux-test-project).I found the
mv command have some issue. The LTP test case use the mv command to
move the directory t1 in the cgroup file system to the /tmp directory.
becase files in the cgroup file system are not allowed to be removed.
so the mv reported "Permission denied", but I used the ls command to
view the results and found that the directory t1 had been removed
from the cgroup file system. For the same test case, I used the mv
tool in the GNU coreutils, and the directory t1 will not be removed.

the following testcase use busybox mv:

/ # mount -t cgroup -o cpu cgroup /cpu
/ # cd /cpu
/cpu # mkdir -p t1
/cpu # ls
cgroup.clone_children  cpu.cfs_period_us  cpu.stat  t1
cgroup.procs           cpu.cfs_quota_us   notify_on_release  tasks
cgroup.sane_behavior   cpu.shares         release_agent
/cpu # mv t1 /tmp
mv: can't remove 't1/cgroup.procs': Operation not permitted
mv: can't remove 't1/cpu.cfs_period_us': Operation not permitted
mv: can't remove 't1/cpu.stat': Operation not permitted
mv: can't remove 't1/cpu.shares': Operation not permitted
mv: can't remove 't1/cpu.cfs_quota_us': Operation not permitted
mv: can't remove 't1/tasks': Operation not permitted
mv: can't remove 't1/notify_on_release': Operation not permitted
mv: can't remove 't1/cgroup.clone_children': Operation not permitted
/cpu # ls
cgroup.clone_children  cpu.cfs_period_us  cpu.stat  cgroup.procs
cpu.cfs_quota_us       notify_on_release  tasks   cgroup.sane_behavior
cpu.shares             release_agent
/cpu #

This patch fixed it, don't call rmdir if remove_file return failure,
and under certain file systems, the mv could work normally.

Signed-off-by: Chen Yu <yu.chen3@zte.com.cn>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agowhois: fix a possible out-of-bounds stack access
Denys Vlasenko [Tue, 4 Sep 2018 12:48:00 +0000 (14:48 +0200)]
whois: fix a possible out-of-bounds stack access

If fgets() returns incomplete string, we replace NUL with
'\n', and then trim() runs on a non-NUL-terminated buffer.
Prevent that.

While at it, bump buffer from 1k to 2k.

function                                             old     new   delta
query                                                519     524      +5

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agochcon: fix issues with recurse and retval for retained files
sagivd [Sat, 25 Aug 2018 10:49:24 +0000 (13:49 +0300)]
chcon: fix issues with recurse and retval for retained files

- recurse is not acting as expected (looks like broken old code)
- when not using verbose output, return value for retained files is 1,
  which is not expected.

Signed-off-by: sagivd <sagivdev@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibbb: fix potential NULL pointer use
Denys Vlasenko [Mon, 3 Sep 2018 08:36:51 +0000 (10:36 +0200)]
libbb: fix potential NULL pointer use

function                                             old     new   delta
unicode_conv_to_printable2                           193     216     +23

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibbb: fix use-after-free in copy_file
Denys Vlasenko [Mon, 3 Sep 2018 08:25:29 +0000 (10:25 +0200)]
libbb: fix use-after-free in copy_file

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agolibbb: in xmalloc_fgets(), use size_t for bb_get_chunk_from_file()
Denys Vlasenko [Sun, 2 Sep 2018 16:48:09 +0000 (18:48 +0200)]
libbb: in xmalloc_fgets(), use size_t for bb_get_chunk_from_file()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoRevert "libbb: remove unnecessary variable in xmalloc_fgets"
Denys Vlasenko [Sun, 2 Sep 2018 16:35:29 +0000 (18:35 +0200)]
Revert "libbb: remove unnecessary variable in xmalloc_fgets"

The variable is in fact necessary.

    commit 2da9724b56169f00bd7fb6b9a11c9409a7620981
    Author: Quentin Rameau <quinq@fifth.space>
    Date:   Sun Apr 1 17:05:35 2018 +0200
        libbb: remove unnecessary variable in xmalloc_fgets

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosmemcap: keep outputting by ignoring transient processes, take two
Denys Vlasenko [Thu, 30 Aug 2018 09:49:51 +0000 (11:49 +0200)]
smemcap: keep outputting by ignoring transient processes, take two

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosmemcap: keep outputting by ignoring transient processes
Andre Goddard Rosa [Sun, 26 Aug 2018 15:37:30 +0000 (17:37 +0200)]
smemcap: keep outputting by ignoring transient processes

function                                             old     new   delta
archivefile                                          167     176      +9

Signed-off-by: Andre Goddard Rosa <andre.rosa@lge.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosysklogd: add timestamp option to ignore message timestamps
Peter Korsgaard [Thu, 9 Aug 2018 09:25:22 +0000 (11:25 +0200)]
sysklogd: add timestamp option to ignore message timestamps

Some syslog producers provide inconsistent timestamps, so provide an option
to ignore the message timestamps and always locally timestamp.  In order to
implement this, invert the valid-timestamp check, but only use the timestamp
if this option is not enabled.

This is in line with what what other syslogd implementations do:

From sysklogd syslogd.c:
 * Sun Nov  7 12:28:47 CET 2004: Martin Schulze <joey@infodrom.org>
 *      Discard any timestamp information found in received syslog
 *      messages.  This will affect local messages sent from a
 *      different timezone.

rsyslog's imuxsock module similary has an (enabled by default)
IgnoreTimestamp option:

https://www.rsyslog.com/doc/v8-stable/configuration/modules/imuxsock.html

function                                             old     new   delta
packed_usage                                       32877   32912     +35
timestamp_and_log                                    363     376     +13
syslogd_main                                        1638    1641      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 51/0)               Total: 51 bytes

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agofix !CONFIG_FLOAT_DURATION build
Denys Vlasenko [Sun, 26 Aug 2018 14:32:16 +0000 (16:32 +0200)]
fix !CONFIG_FLOAT_DURATION build

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoping: use setitimer() instead of ualarm()
Denys Vlasenko [Sat, 25 Aug 2018 17:36:06 +0000 (19:36 +0200)]
ping: use setitimer() instead of ualarm()

function                                             old     new   delta
sendping_tail                                        218     265     +47
ualarm                                                79       -     -79
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/0 up/down: 47/-79)            Total: -32 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoip: tweak --help text
Denys Vlasenko [Tue, 14 Aug 2018 09:19:09 +0000 (11:19 +0200)]
ip: tweak --help text

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: tweak comment, no code changes
Denys Vlasenko [Tue, 14 Aug 2018 09:04:58 +0000 (11:04 +0200)]
hush: tweak comment, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: add a comment on how globbing (should) work
Denys Vlasenko [Sat, 11 Aug 2018 16:44:11 +0000 (18:44 +0200)]
hush: add a comment on how globbing (should) work

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: expand: Do not quote backslashes in unquoted parameter expansion
Denys Vlasenko [Tue, 7 Aug 2018 16:54:52 +0000 (18:54 +0200)]
ash: expand: Do not quote backslashes in unquoted parameter expansion

Upstream commit:

    Date: Wed, 28 Mar 2018 18:37:51 +0800
    expand: Do not quote backslashes in unquoted parameter expansion

    Here is a better example:

        a="/*/\nullx" b="/*/\null"; printf "%s\n" $a $b

    dash currently prints

        /*/\nullx
        /*/\null

    bash prints

        /*/\nullx
        /dev/null

    You may argue the bash behaviour is inconsistent but it actually
    makes sense.  What happens is that quote removal only applies to
    the original token as seen by the shell.  It is never applied to
    the result of parameter expansion.

    Now you may ask why on earth does the second line say "/dev/null"
    instead of "/dev/\null".  Well that's because it is not the quote
    removal step that removed the backslash, but the pathname expansion.

    The fact that the /de\v does not become /dev even though it exists
    is just the result of the optimisation to avoid unnecessarily
        calling stat(2).  I have checked POSIX and I don't see anything
    that forbids this behaviour.

    So going back to dash yes I think we should adopt the bash behaviour
    for pathname expansion and keep the existing case semantics.

    This patch does exactly that.  Note that this patch does not work
    unless you have already applied

        https://patchwork.kernel.org/patch/10306507/

    because otherwise the optimisation mentioned above does not get
    detected correctly and we will end up doing quote removal twice.

    This patch also updates expmeta to handle naked backslashes at
    the end of the pattern which is now possible.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function                                             old     new   delta
expmeta                                              618     653     +35
memtodest                                            146     147      +1

Tested to work with both ASH_INTERNAL_GLOB on and off.

hush does not handle this correctly.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: adopt ash's quote_in_varexp1.tests
Denys Vlasenko [Sun, 5 Aug 2018 18:03:04 +0000 (20:03 +0200)]
hush: adopt ash's quote_in_varexp1.tests

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: exec: Return 126 on most errors in shellexec
Denys Vlasenko [Sun, 5 Aug 2018 16:04:09 +0000 (18:04 +0200)]
ash: exec: Return 126 on most errors in shellexec

Upstream commit:

    Date: Sat, 19 May 2018 02:39:37 +0800
    exec: Return 126 on most errors in shellexec

    Currently when shellexec fails on most errors the shell will exit
    with exit status 2.  This patch changes it to 126 in order to avoid
    ambiguities with the exit status from a successful exec.

    The errors that result in 127 has also been expanded to include
    ENOTDIR, ENAMETOOLONG and ELOOP.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function                                             old     new   delta
shellexec                                            245     254      +9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: eval: Restore input files in evalcommand
Denys Vlasenko [Sun, 5 Aug 2018 15:07:26 +0000 (17:07 +0200)]
ash: eval: Restore input files in evalcommand

Upstream commit:

    Date: Tue, 27 Mar 2018 00:39:35 +0800
    eval: Restore input files in evalcommand

    When evalcommand invokes a command that modifies parsefile and
    then bails out without popping the file, we need to ensure the
    input file is restored so that the shell can continue to execute.

Reported-by: Martijn Dekker <martijn@inlv.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function                                             old     new   delta
unwindfiles                                            -      20     +20
evalcommand                                         1635    1653     +18
getoptscmd                                           584     595     +11
popallfiles                                           20      10     -10
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/1 up/down: 49/-10)             Total: 39 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: parser: Fix parsing of ${}
Denys Vlasenko [Sun, 5 Aug 2018 13:58:13 +0000 (15:58 +0200)]
ash: parser: Fix parsing of ${}

Upstream commit:

    Date: Tue, 3 Apr 2018 00:40:25 +0800
    parser: Fix parsing of ${}

    dash -c 'echo ${}' should print "Bad subtitution" but instead
    fails with "Syntax error: Missing '}'".  This is caused by us
    reading an extra character beyond the right brace.  This patch
    fixes it so that this construct only fails during expansion rather
    than during parsing.

    Fixes: 3df3edd13389 ("[PARSER] Report substition errors at...")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function                                             old     new   delta
readtoken1                                          2907    2916      +9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash,hush: fold shell_builtin_read() way-too-many params into a struct param
Denys Vlasenko [Sun, 5 Aug 2018 13:42:29 +0000 (15:42 +0200)]
ash,hush: fold shell_builtin_read() way-too-many params into a struct param

function                                             old     new   delta
getoptscmd                                           587     584      -3
readcmd                                              240     224     -16
shell_builtin_read                                  1426    1399     -27
builtin_read                                         210     182     -28
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-74)             Total: -74 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: set IFS to default on startup
Denys Vlasenko [Sun, 5 Aug 2018 13:13:08 +0000 (15:13 +0200)]
hush: set IFS to default on startup

function                                             old     new   delta
hush_main                                           1095    1110     +15

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix fallout from FILE->HFILE conversion
Denys Vlasenko [Sun, 5 Aug 2018 12:55:01 +0000 (14:55 +0200)]
hush: fix fallout from FILE->HFILE conversion

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: expand: Fix ghost fields with unquoted $@/$*
Denys Vlasenko [Sun, 5 Aug 2018 12:29:58 +0000 (14:29 +0200)]
ash: expand: Fix ghost fields with unquoted $@/$*

Upstream commit:

    Date: Fri, 23 Mar 2018 18:58:47 +0800
    expand: Fix ghost fields with unquoted $@/$*

    You're right.  The proper fix to this is to ensure that nulonly
    is not set in varvalue for $*.  It should only be set for $@ when
    it's inside double quotes.

    In fact there is another bug while we're playing with $@/$*.
    When IFS is set to a non-whitespace character such as :, $*
    outside quotes won't remove empty fields as it should.

    This patch fixes both problems.

Reported-by: Martijn Dekker <martijn@inlv.org>
Suggested-by: Harald van Dijk <harald@gigawatt.nl>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function                                             old     new   delta
argstr                                              1111    1113      +2
evalvar                                              571     569      -2
varvalue                                             579     576      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/2 up/down: 2/-5)               Total: -3 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: var: Set IFS to fixed value at start time
Denys Vlasenko [Sun, 5 Aug 2018 11:59:35 +0000 (13:59 +0200)]
ash: var: Set IFS to fixed value at start time

Upstream commit:

    Date: Sat, 19 May 2018 02:39:43 +0800
    var: Set IFS to fixed value at start time

    This patch forces the IFS variable to always be set to its default
    value, regardless of the environment.

    It also removes the long unused IFS_BROKEN code.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash: eval: Variable assignments on functions are no longer persistent
Denys Vlasenko [Sun, 5 Aug 2018 08:39:18 +0000 (10:39 +0200)]
ash: eval: Variable assignments on functions are no longer persistent

Upstream commit:

    Date: Wed, 4 Apr 2018 17:54:01 +0800
    eval: Variable assignments on functions are no longer persistent

    Dirk Fieldhouse <fieldhouse@gmx.net> wrote:
    > In POSIX.1-2017 ("simultaneously IEEE Std 1003.1™-2017 and The Open
    > Group Technical Standard Base Specifications, Issue 7")
    > <http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09>,
    > we read under '2.9.1 Simple Commands'
    >
    > "Variable assignments shall be performed as follows:
    > ...
    > -    If the command name is a standard utility implemented as a function
    > (see XBD Utility), the effect of variable assignments shall be as if the
    > utility was not implemented as a function.
    > ...
    > -    If the command name is a function that is not a standard utility
    > implemented as a function, variable assignments shall affect the current
    > execution environment during the execution of the function. It is
    > unspecified:
    >
    >     *   Whether or not the variable assignments persist after the
    > completion of the function
    >
    >     *   Whether or not the variables gain the export attribute during
    > the execution of the function
    >
    >     *   Whether or not export attributes gained as a result of the
    > variable assignments persist after the completion of the function (if
    > variable assignments persist after the completion of the function)"

    POSIX used to require the current dash behaviour.  However, you're
    right that this is no longer the case.

    This patch will remove the persistence of the variable assignment.

    I have considered the exporting the variables during the function
    execution but have decided against it because:

    1) It makes the code bigger.
    2) dash has never done this in the past.
    3) You cannot use this portably anyway.

Reported-by: Dirk Fieldhouse <fieldhouse@gmx.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
function                                             old     new   delta
evalcommand                                         1606    1635     +29
evalcase                                             313     317      +4
evalfun                                              280     268     -12
pushlocalvars                                         48       -     -48
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/1 up/down: 33/-60)            Total: -27 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoash,hush: properly handle ${v//pattern/repl} if pattern starts with /
Denys Vlasenko [Sat, 4 Aug 2018 20:25:28 +0000 (22:25 +0200)]
ash,hush: properly handle ${v//pattern/repl} if pattern starts with /

Closes 2695

function                                             old     new   delta
parse_dollar                                         762     790     +28
subevalvar                                          1258    1267      +9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 37/0)               Total: 37 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>