oweals/busybox.git
4 years agoash: eval: Only restore exit status on exit/return
Denys Vlasenko [Thu, 20 Feb 2020 15:54:29 +0000 (16:54 +0100)]
ash: eval: Only restore exit status on exit/return

Upstream commit:

    Date: Fri, 14 Dec 2018 13:52:02 +0800
    eval: Only restore exit status on exit/return

    We unconditionally restore the saved status in exitreset, which
    is incorrect as we only want to do it for exitcmd and returncmd.
    This patch fixes the problem by introducing EXEND.

Reported-by: Martijn Dekker <martijn@inlv.org>
    Fixes: da30b4b78769 ("[BUILTIN] Exit without arguments in a trap...")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: Return without arguments in a trap should use status outside traps
Denys Vlasenko [Thu, 20 Feb 2020 15:47:01 +0000 (16:47 +0100)]
ash: Return without arguments in a trap should use status outside traps

Fixes exitcode_trap4.tests.
Upstream commit:

    Date: Mon, 6 Oct 2014 21:51:26 +0800
    Return without arguments in a trap should use status outside traps

    POSIX now requires that return without arguments in a trap should
    return the last command status prior to executing traps.  This
    patch implements this behaviour.

    Incidentally this also changes the behaviour of return without
    arguments in a loop conditional to use the last exit status in
    the body as opposed to the last command in the conditional when
    there is one.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agohush: implement "return NUM in trap sets $? after trap"
Denys Vlasenko [Thu, 20 Feb 2020 15:37:59 +0000 (16:37 +0100)]
hush: implement "return NUM in trap sets $? after trap"

function                                             old     new   delta
builtin_return                                        47      67     +20
check_and_run_traps                                  243     259     +16
run_pipe                                            1583    1597     +14
hush_main                                           1076    1086     +10
run_list                                            1054    1055      +1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 5/0 up/down: 61/0)               Total: 61 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: return exit status of nofork applets (again)
Ron Yorston [Thu, 20 Feb 2020 08:23:03 +0000 (08:23 +0000)]
ash: return exit status of nofork applets (again)

Since commit d81af7216 (ash: eval: Reap zombies after built-in commands
and functions) if the shell is compiled with SH_STANDALONE and SH_NOFORK
enabled nofork applets potentially return the incorrect status.

The status value returned by evalcommand() in this case is obtained from
exitstatus in a call to waitforjob(NULL).  This overwrites the status
set for nonfork applets.

If this commit seems familiar it's essentially a reversion of commit
5ccb0e92fa (ash: return exit status of nofork applets).  What was correct
in 2016 is wrong in 2020 and vice versa.

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: expand: Merge syntax/quotes in memtodest with flags
Denys Vlasenko [Thu, 20 Feb 2020 09:06:20 +0000 (10:06 +0100)]
ash: expand: Merge syntax/quotes in memtodest with flags

Upstream commit:

    Date: Mon, 28 May 2018 00:17:39 +0800
    expand: Merge syntax/quotes in memtodest with flags

    The function arguments syntax and quotes are both derived from
    the expansion flags.  As syntax is only used by memtodest we do
    not need to maintain it outside of the function at all.

    The only place that uses something other than BASESYNTAX or DQSYNTAX
    is exptilde.  However in that case DQSYNTAX has exactly the same
    effect as SQSYNTAX.

    This patch merges these two arguments into a single flags.  The
    macro QUOTES_KEEPNUL has been renamed to EXP_KEEPNUL in order
    to keep the namespace separate.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: eval: Always set localvar_stop
Denys Vlasenko [Thu, 20 Feb 2020 09:33:38 +0000 (10:33 +0100)]
ash: eval: Always set localvar_stop

Upstream commit:

    Date: Thu, 31 May 2018 01:15:34 +0800
    eval: Always set localvar_stop

    The variable localvar_stop is set iff vlocal is true.  gcc doesn't
    get this so we get a spurious warning.

    This patch fixes this by always calling pushlocalvars with vlocal
    and making it only actually do the push if vlocal is non-zero.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: eval: Replace with listsetvar with mklocal/setvareq
Denys Vlasenko [Wed, 19 Feb 2020 16:33:44 +0000 (17:33 +0100)]
ash: eval: Replace with listsetvar with mklocal/setvareq

Upstream commit:

    Date: Sat, 19 May 2018 02:39:55 +0800
    eval: Replace with listsetvar with mklocal/setvareq

    This patch replaces listsetvar with mklocal/setvareq.  As we now
    determine special built-in status prior to variable assignment, we
    no longer have to do a second pass listsetvar.  Instead we will
    call setvareq directly instead of mklocal when necessary.

    In order to do this mklocal can now take a flag in order to mark
    a variable for export.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: eval: Fail immediately with redirections errors for simple command
Denys Vlasenko [Wed, 19 Feb 2020 14:30:20 +0000 (15:30 +0100)]
ash: eval: Fail immediately with redirections errors for simple command

Upstream commit:

    Date: Sat, 19 May 2018 02:39:54 +0800
    eval: Fail immediately with redirections errors for simple command

    Previously, dash would continue to perform variable expansions
    even if a redirection error occured.  This patch changes it so
    that it fails immediately.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: eval: Add assignment built-in support again
Denys Vlasenko [Wed, 19 Feb 2020 14:15:13 +0000 (15:15 +0100)]
ash: eval: Add assignment built-in support again

Upstream commit:

    Date: Sat, 19 May 2018 02:39:52 +0800
    eval: Add assignment built-in support again

    This patch adds assignment built-in support that used to exist
    in dash prior to 0.3.8-15.  This is because it will soon be part
    of POSIX, and the semantics are now much better defined.

    Recognition is done at execution time, so even "command -- export"
    or "var=export; command $var" should work.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash,hush: testcase for "exit" without arguments in a trap
Denys Vlasenko [Wed, 19 Feb 2020 11:10:41 +0000 (12:10 +0100)]
ash,hush: testcase for "exit" without arguments in a trap

hush fails this one

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash,hush: add comment about masked SIGCHLD, handle SIG_IGNed SIGHUP as in bash
Denys Vlasenko [Tue, 18 Feb 2020 15:46:01 +0000 (16:46 +0100)]
ash,hush: add comment about masked SIGCHLD, handle SIG_IGNed SIGHUP as in bash

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: jobs: Only clear gotsigchld when waiting for everything
Denys Vlasenko [Tue, 18 Feb 2020 14:37:43 +0000 (15:37 +0100)]
ash: jobs: Only clear gotsigchld when waiting for everything

Upstream commit:

    Date: Sat, 19 May 2018 02:39:41 +0800
    jobs: Only clear gotsigchld when waiting for everything

    The gotsigchld flag is always cleared in dowait but not all callers
    of dowait will wait for everything.  In particular, when jp is set
    we only wait until the set job isn't running anymore.

    This patch fixes this by only clearing gotsigchld if jp is unset.
    It also changes the waitcmd to actually set jp which corresponds
    to the behaviour of bash/ksh93/mksh.

    The only other caller of dowait that doesn't wait for everything
    is the jobless reaper.  This is in fact redundant now that we wait
    after every simple command.  This patch removes it.

    Finally as every caller of dowait needs to wait until either the
    given job is not running, or until all terminated jobs have been
    processed, this patch moves the loop into dowait itself.

    Fixes: 03876c0743a5 ("eval: Reap zombies after built-in...")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: jobs - Do not block when waiting on SIGCHLD
Denys Vlasenko [Tue, 18 Feb 2020 13:37:56 +0000 (14:37 +0100)]
ash: jobs - Do not block when waiting on SIGCHLD

Upstream comment:

    Date: Mon, 7 May 2018 00:40:34 +0800
    jobs - Do not block when waiting on SIGCHLD

    Because of the nature of SIGCHLD, the process may have already been
    waited on and therefore we must be prepared for the case that wait
    may block.  So ensure that it doesn't by using WNOHANG.

    Furthermore, multiple jobs may have exited when gotsigchld is set.
    Therefore we need to wait until there are no zombies left.

    Lastly, waitforjob needs to be called with interrupts off and
    the original patch broke that.

    Fixes: 03876c0743a5 ("eval: Reap zombies after built-in...")
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
While at it, removed INT_ON/OFF in waitforjob() - it must be called
from INT_OFF region anyway.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: eval: Reap zombies after built-in commands and functions
Denys Vlasenko [Tue, 18 Feb 2020 13:28:30 +0000 (14:28 +0100)]
ash: eval: Reap zombies after built-in commands and functions

Upstream commit:

    Date: Mon, 26 Mar 2018 23:55:50 +0800
    eval: Reap zombies after built-in commands and functions

    Currently dash does not reap dead children after built-in commands
    or functions.  This means that if you construct a loop consisting
    of solely built-in commands and functions, then zombies can hang
    around indefinitely.

    This patch fixes this by reaping when necessary after each built-in
    command and function.

Reported-by: Denys Vlasenko <vda.linux@googlemail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: exec: Never rehash regular built-ins
Denys Vlasenko [Mon, 17 Feb 2020 15:20:05 +0000 (16:20 +0100)]
ash: exec: Never rehash regular built-ins

Upstream commit:

    Date: Sat, 19 May 2018 02:39:51 +0800
    exec: Never rehash regular built-ins

    As regular (including special) built-ins can never be overridden,
    we should never remove them from the hash table.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: exec: Stricter pathopt parsing
Denys Vlasenko [Mon, 17 Feb 2020 15:02:40 +0000 (16:02 +0100)]
ash: exec: Stricter pathopt parsing

Upstream comment:

    Date: Sat, 19 May 2018 02:39:50 +0800
    exec: Stricter pathopt parsing

    This patch changes the parsing of pathopt.  First of all only
    %builtin and %func (with arbitrary suffixes) will be recognised.
    Any other pathopt will be treated as a normal directory.

    Furthermore, pathopt can now be specified before the directory,
    rather than after it.  In fact, a future version may remove support
    for pathopt suffixes.

    Wherever the pathopt is placed, an optional % may be placed after
    it to terminate the pathopt.

    This is so that it is less likely that a genuine directory containing
    a % sign is parsed as a pathopt.

    Users of padvance outside of exec.c have also been modified:

    1) cd(1) will always treat % characters as part of the path.
    2) chkmail will continue to accept arbitrary pathopt.
    3) find_dot_file will ignore the %builtin pathopt instead of trying
    to do a stat in the accompanying directory (which is usually the
    current directory).

    The patch also removes the clearcmdentry optimisation where we
    attempt to only partially flush the table where possible.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: exec: Do not allocate stack string in padvance
Denys Vlasenko [Mon, 17 Feb 2020 14:27:41 +0000 (15:27 +0100)]
ash: exec: Do not allocate stack string in padvance

Upstream commit:

    Date: Sat, 19 May 2018 02:39:48 +0800
    exec: Do not allocate stack string in padvance

    Many callers of padvance immediately free the allocated string
    so this patch moves the stalloc call to the caller.  Instead of
    returning the allocated string, padvance now returns the length
    to allocate (this may be longer than the actual string length,
    even including the NUL).  For the case where we would previously
    return NULL, we now return -1.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: memalloc: Add growstackto helper
Denys Vlasenko [Mon, 17 Feb 2020 14:59:08 +0000 (15:59 +0100)]
ash: memalloc: Add growstackto helper

Upstream commit:

    Date: Sat, 19 May 2018 02:39:46 +0800
    memalloc: Add growstackto helper

    This patch adds the growstackto helper which repeatedly calls
    growstackblock until the requested size is reached.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: parser: Save/restore here-documents in command substitution
Denys Vlasenko [Mon, 17 Feb 2020 11:11:26 +0000 (12:11 +0100)]
ash: parser: Save/restore here-documents in command substitution

Upstream comment:

    Date: Sat, 19 May 2018 02:39:42 +0800
    parser: Save/restore here-documents in command substitution

    This patch changes the parsing of here-documents within command
    substitution, both old style and new style.  In particular, the
    original here-document list is saved upon the beginning of parsing
    command substitution and restored when exiting.

    This means that here-documents outside of command substitution
    can no longer be filled by text within it and vice-versa.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: mkinit: Split reset into exitreset and reset
Denys Vlasenko [Mon, 17 Feb 2020 10:22:59 +0000 (11:22 +0100)]
ash: mkinit: Split reset into exitreset and reset

Upstream commit:

    Date: Sat, 19 May 2018 02:39:40 +0800
    mkinit: Split reset into exitreset and reset

    Previously reset was called after exitshell.  This was changed
    so that it was called before exitshell because certain state needed
    to be reset in order for the EXIT trap to work.

    However, this caused issues because certain other states (such
    as local variables) should not be reset.  This patch fixes this
    by creating a new function exitreset that is called prior to
    exitshell and moving reset back to its original location.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: expand: Fix trailing newlines processing in backquote expanding
Denys Vlasenko [Mon, 17 Feb 2020 09:24:32 +0000 (10:24 +0100)]
ash: expand: Fix trailing newlines processing in backquote expanding

Upstream commit:

    Date: Mon, 29 Apr 2019 19:13:37 +0500
    expand: Fix trailing newlines processing in backquote expanding

    According to POSIX.1-2008 we should remove newlines only at the end of
    the substitution. Newlines-only substitions causes dash to remove
    newlines before beggining of the substitution. The following code:

        cat <<END
        1
        $(echo "")
        2
        END

    prints "1<newline>2" instead of expected "1<newline><newline>2".

    This patch fixes trailing newlines processing in backquote expanding.

Signed-off-by: Nikolai Merinov <n.merinov@inango-systems.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: parser: Only accept single-digit parameter expansion outside of braces
Denys Vlasenko [Mon, 17 Feb 2020 09:15:35 +0000 (10:15 +0100)]
ash: parser: Only accept single-digit parameter expansion outside of braces

Upstream commit:

    Date: Mon, 27 May 2019 13:39:37 +0800
    parser: Only accept single-digit parameter expansion outside of braces

    This patch should fix the problem.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: shell: Fix clang warnings about "string plus integer"
Denys Vlasenko [Sun, 16 Feb 2020 18:06:42 +0000 (19:06 +0100)]
ash: shell: Fix clang warnings about "string plus integer"

Upstream commit:

    Date: Sat, 15 Dec 2018 18:49:31 +0100
    shell: Fix clang warnings about "string plus integer"

    Building with clang results in some warnings about integer values being
    added to strings.

    While the code itself is fine and the warnings are indeed harmless,
    fixing them also makes the semantic more explicit: what it is actually
    being increased is the address which points to the start of the string
    in order to skip the initial character when some conditions are met.

Signed-off-by: Antonio Ospite <ao2@ao2.it>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: eval: Use the correct expansion mode for fd redirection
Denys Vlasenko [Sun, 16 Feb 2020 18:02:22 +0000 (19:02 +0100)]
ash: eval: Use the correct expansion mode for fd redirection

Upstream comment:

    Date: Mon, 19 Nov 2018 18:00:32 +0800
    eval: Use the correct expansion mode for fd redirection

    It has been reported that

            echo test >&$EMPTY_VARIABLE

    causes dash to segfault.  This is a symptom of the bigger problem
    that dash tries to perform pathname expansion as well as field
    splitting on the word after >& and <&.  This is wrong and this
    patch fixes it to use the same expansions as done on a normal
    redirection.

Reported-by: Andrej Shadura <andrew.shadura@collabora.co.uk>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: expand: Fix skipping of command substitution when trimming in evalvar
Denys Vlasenko [Sun, 16 Feb 2020 17:42:50 +0000 (18:42 +0100)]
ash: expand: Fix skipping of command substitution when trimming in evalvar

Upstream commit:

    Date: Mon, 28 May 2018 17:09:48 +0800
    expand: Fix skipping of command substitution when trimming in evalvar

    When we are trimming an unset variable in evalvar, any embedded
    command substitution that should have been skipped are not.  This
    can cause them to be evaluated later should there be other command
    substitutions in the same input word.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: main: Print \n upon EOF (CTRL-D) when run interactively
Denys Vlasenko [Sun, 16 Feb 2020 17:57:53 +0000 (18:57 +0100)]
ash: main: Print \n upon EOF (CTRL-D) when run interactively

Upstream comment:

    Date: Fri, 7 Sep 2018 10:34:14 +0200
    main: Print \n upon EOF (CTRL-D) when run interactively

    Exiting dash via a ^D instead of with "exit" causes dash to forget to
    print a newline.

        sh-3.1$ sh
        sh-3.1$ ^D
        sh-3.1$ dash
        $ sh-3.1$

    It is more neat and tidy to send a newline similarly to what bash does,
    so it doesn't make the next prompt of the parent shell look ugly.

    Suggested by jidanni.

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
    [reworded the patch description]
Signed-off-by: Andrej Shadura <andrew.shadura@collabora.co.uk>
    Bug-Debian: http://bugs.debian.org/476422
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: expand: Use HOME in tilde expansion when it is empty
Denys Vlasenko [Sun, 16 Feb 2020 17:31:05 +0000 (18:31 +0100)]
ash: expand: Use HOME in tilde expansion when it is empty

Upstream commit:

    Date: Sun, 27 May 2018 17:31:57 +0800
    expand: Use HOME in tilde expansion when it is empty

    Currently if HOME is set to empty tilde expansion will fail, i.e.,
    it will remain as a literal tilde.  This patch changes it to
    return the empty string as required by POSIX.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: builtin: Mark more regular built-ins
Denys Vlasenko [Sun, 16 Feb 2020 17:29:52 +0000 (18:29 +0100)]
ash: builtin: Mark more regular built-ins

Upstream commit:

    Date: Sat, 19 May 2018 02:39:49 +0800
    builtin: Mark more regular built-ins

    This patch marks the following built-ins as regular, meaning that
    they cannot be overriden using PATH search:

            hash
            pwd
            type
            ulimit

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: jobs: Replace some uses of fmtstr with stpcpy/stpncpy
Denys Vlasenko [Sun, 16 Feb 2020 17:23:43 +0000 (18:23 +0100)]
ash: jobs: Replace some uses of fmtstr with stpcpy/stpncpy

Upstream commit:

    Date: Sat, 19 May 2018 02:39:45 +0800
    jobs: Replace some uses of fmtstr with stpcpy/stpncpy

    Some uses of fmtstr, particularly the ones without a format string,
    can be replaced with stpcpy or stpncpy.  This patch does that so
    we don't have to introduce unnecessary format strings in order to
    silence compiler warnings.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: output: Fix fmtstr return value
Denys Vlasenko [Sun, 16 Feb 2020 17:06:20 +0000 (18:06 +0100)]
ash: output: Fix fmtstr return value

Upstream commit:

    Date: Sat, 19 May 2018 02:39:44 +0800
    output: Fix fmtstr return value

    The function fmtstr is meant to return the actual length of output
    produced, rather than the untruncated length.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: main: Only set savestatus in exitcmd
Denys Vlasenko [Fri, 14 Feb 2020 16:32:22 +0000 (17:32 +0100)]
ash: main: Only set savestatus in exitcmd

Upstream commit:

    Date: Sat, 19 May 2018 02:39:38 +0800
    main: Only set savestatus in exitcmd

    Currently exitcmd sets exitstatus and then savestatus if the latter
    was previously set.  In fact, as exitcmd always raises an exception
    and will either end up in the setjmp call in main() or exitshell(),
    where exitstatus is always replaced by savestatus if set, we only
    need to set savestatus.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: [BUILTIN] Exit without arguments in a trap should use status outside traps
Denys Vlasenko [Fri, 14 Feb 2020 16:27:18 +0000 (17:27 +0100)]
ash: [BUILTIN] Exit without arguments in a trap should use status outside traps

Upstream commit:

    Date:   Mon Oct 6 10:39:47 2014 +0800
    [BUILTIN] Exit without arguments in a trap should use status outside traps

    POSIX now requires that exit without arguments in a trap should
    return the last command status prior to executing traps.  This
    patch implements this behaviour.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: parser: Fix incorrect eating of backslash newlines
Denys Vlasenko [Fri, 14 Feb 2020 15:16:34 +0000 (16:16 +0100)]
ash: parser: Fix incorrect eating of backslash newlines

Keeping up with upstream (in our case, 'before patch' code is not buggy).
Upstream commit:

    Date: Fri, 11 May 2018 23:41:25 +0800
    parser: Fix incorrect eating of backslash newlines

    With the introduction of synstack->syntax, a number of references
    to the syntax variable was missed during the conversion.  This
    causes backslash newlines to be incorrectly removed in single
    quote context.

    This patch also combines these calls into a new helper function
    pgetc_top.

    Fixes: ab1cecb40478 ("parser: Add syntax stack for recursive...")
Reported-by: Leah Neukirchen <leah@vuxu.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: use pgetc_eatbnl() in more places, take 2
Denys Vlasenko [Fri, 14 Feb 2020 15:12:06 +0000 (16:12 +0100)]
ash: use pgetc_eatbnl() in more places, take 2

Adding previously skipped "readtoken1(pgetc_eatbnl(), DQSYNTAX..." changes
from upstream commit:

    Date:   Thu Mar 8 08:37:11 2018 +0100
    Author: Harald van Dijk <harald@gigawatt.nl>
    parser: use pgetc_eatbnl() in more places

    dash has a pgetc_eatbnl function in parser.c which skips any
    backslash-newline combinations. It's not used everywhere it could be.
    There is also some duplicated backslash-newline handling elsewhere in
    parser.c. Replace most of the calls to pgetc() with calls to
    pgetc_eatbnl() and remove the duplicated backslash-newline handling.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agofdisk: add HFS / HFS+ partition type
Denys Vlasenko [Fri, 14 Feb 2020 12:57:41 +0000 (13:57 +0100)]
fdisk: add HFS / HFS+ partition type

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agotftp: on download, open local file only when first bit of data arrived
Denys Vlasenko [Thu, 13 Feb 2020 14:27:23 +0000 (15:27 +0100)]
tftp: on download, open local file only when first bit of data arrived

No reason to potentially clobber existing file before absolutely necessary.

function                                             old     new   delta
tftp_protocol                                       1947    2020     +73
tftp_main                                            393     376     -17
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 73/-17)             Total: 56 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agotftp: fix thinko in code shrink
Denys Vlasenko [Thu, 13 Feb 2020 14:03:12 +0000 (15:03 +0100)]
tftp: fix thinko in code shrink

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agotftp: code shrink
Denys Vlasenko [Thu, 13 Feb 2020 12:01:43 +0000 (13:01 +0100)]
tftp: code shrink

function                                             old     new   delta
tftp_protocol                                       1949    1947      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agotftpd: show requested file name in open error message
Denys Vlasenko [Thu, 13 Feb 2020 11:58:46 +0000 (12:58 +0100)]
tftpd: show requested file name in open error message

function                                             old     new   delta
tftp_protocol                                       1902    1949     +47

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoawk: fix more "length" cases, closes 12486
Denys Vlasenko [Sun, 2 Feb 2020 22:28:55 +0000 (23:28 +0100)]
awk: fix more "length" cases, closes 12486

function                                             old     new   delta
next_token                                           808     831     +23

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash,hush: allow builtins to be tab-completed, closes 7532
Ron Yorston [Tue, 21 Jan 2020 16:01:58 +0000 (16:01 +0000)]
ash,hush: allow builtins to be tab-completed, closes 7532

function                                             old     new   delta
complete_cmd_dir_file                                678     830    +152
get_builtin_name                                       -      35     +35
optschanged                                          125     132      +7
hush_main                                           1069    1076      +7
save_command_ps_at_cur_history                        76      78      +2
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 4/0 up/down: 203/0)             Total: 203 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoxargs: fix handling of quoted arguments, closes 11441
Ron Yorston [Fri, 24 Jan 2020 13:16:45 +0000 (13:16 +0000)]
xargs: fix handling of quoted arguments, closes 11441

As reported in bug 11441 when presented with a large number of quoted
arguments xargs can return 'argument line too long':

   seq 10000 29999 | sed -e 's/^/"/' -e 's/$/"/' | busybox xargs echo

This happens because the variant of process_stdin() which handles quoted
arguments doesn't preserve state between calls.  If the allowed number
of characters is exceeded part way through a quoted argument the next
call to process_stdin() incorrectly treats the terminating quote as a
starting quote, thus quoting all of the argument separators.

function                                             old     new   delta
process_stdin                                        274     303     +29
xargs_main                                           731     745     +14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 43/0)               Total: 43 bytes

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agovi: fixes to string search in colon commands, closes 10321
Ron Yorston [Thu, 23 Jan 2020 15:31:19 +0000 (15:31 +0000)]
vi: fixes to string search in colon commands, closes 10321

Handling of string searches in colon commands (e.g ':/pat1/,/pat2/cmd')
differ from standard vi:

- As reported in bug 10321 such searches can't be repeated using the
  'n' command.  This is because the last search pattern isn't updated.

- The search also can't be repeated using the command '://' because
  an empty search pattern doesn't imply the use of the last search
  pattern.

- Such searches should start on the line after the current line,
  otherwise '://' never moves to the next occurrence of the pattern.
  This can also affect other cases where line ranges are specified
  using search patterns.

Fix these various issues.

function                                             old     new   delta
get_one_address                                      325     342     +17

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoash: improve expandstr()
Ron Yorston [Thu, 23 Jan 2020 11:26:08 +0000 (11:26 +0000)]
ash: improve expandstr()

The dash maintainer recently posted a fix for issues with expanding
PS1.  These had already been fixed differently in BusyBox ash.  Borrow
a couple of improvements:

- Use a single call to setjmp() to trap errors in both readtoken1()
  and expandarg().

- In case of error set the prompt to the literal value of PS1 rather
  than the half-digested nonsense in stackblock() which might include
  ugly control characters.

function                                             old     new   delta
expandstr                                            353     300     -53

Signed-off-by: Ron Yorston <rmy@pobox.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agosyslogd: add config option to include milliseconds in timestamps
Peter Korsgaard [Mon, 27 Jan 2020 14:36:41 +0000 (15:36 +0100)]
syslogd: add config option to include milliseconds in timestamps

For some use cases, having logs with more than 1 second accuracy can be
helpful.  Add an option to include milliseconds when adding a timestamp in
HH:MM:SS.mmm format, similar to syslog-ng with fraq_digits(3) or journalctl
-o short-precise.

For simplicity, abuse the remaining space in the buffer used by ctime to add
the millieconds (overwriting year).

function                                             old     new   delta
timestamp_and_log                                    401     448     +47

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoudhcpd: mangle hostnames starting with dash ("-option")
Denys Vlasenko [Tue, 14 Jan 2020 16:05:48 +0000 (17:05 +0100)]
udhcpd: mangle hostnames starting with dash ("-option")

function                                             old     new   delta
add_lease                                            316     328     +12

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agowhois: limit total length of response to 32+2 kb
Denys Vlasenko [Tue, 3 Dec 2019 13:52:17 +0000 (14:52 +0100)]
whois: limit total length of response to 32+2 kb

function                                             old     new   delta
query                                                517     554     +37

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoinit: improve handling of signals racing with each other
Denys Vlasenko [Tue, 3 Dec 2019 12:48:55 +0000 (13:48 +0100)]
init: improve handling of signals racing with each other

Before this change, a request to reboot could be "overwritten" by e.g.
SIGHUP.

function                                             old     new   delta
init_main                                            709     793     +84
packed_usage                                       33273   33337     +64
run_actions                                          109     117      +8
stop_handler                                          87      88      +1
check_delayed_sigs                                   340     335      -5
run                                                  214     198     -16
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/2 up/down: 157/-21)           Total: 136 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoinit: if tcgetattr() fails, don't even try to tcsetattr()
Denys Vlasenko [Mon, 2 Dec 2019 15:39:54 +0000 (16:39 +0100)]
init: if tcgetattr() fails, don't even try to tcsetattr()

function                                             old     new   delta
set_sane_term                                        111     114      +3

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agohush: fix preprocessor directives indentation
Denys Vlasenko [Thu, 28 Nov 2019 09:28:14 +0000 (10:28 +0100)]
hush: fix preprocessor directives indentation

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agogrep: add -R
Tomi Leppanen [Mon, 25 Nov 2019 15:59:52 +0000 (17:59 +0200)]
grep: add -R

This adds -R option to grep similar to GNU grep. It is the same as -r
but also dereferences symbolic links to directories.

function                                             old     new   delta
grep_main                                            834     850     +16
packed_usage                                       33362   33368      +6
grep_file                                           1440    1441      +1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 23/0)               Total: 23 bytes

Signed-off-by: Tomi Leppanen <tomi.leppanen@jolla.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agobc: fix comparison bug, closes 12336
Denys Vlasenko [Sat, 23 Nov 2019 16:25:21 +0000 (17:25 +0100)]
bc: fix comparison bug, closes 12336

function                                             old     new   delta
bc_num_cmp                                           249     259     +10

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoRemove stime() function calls
Alistair Francis [Tue, 19 Nov 2019 12:06:40 +0000 (13:06 +0100)]
Remove stime() function calls

stime() has been deprecated in glibc 2.31 and replaced with
clock_settime(). Let's replace the stime() function calls with
clock_settime() in preperation.

function                                             old     new   delta
rdate_main                                           197     224     +27
clock_settime                                          -      27     +27
date_main                                            926     941     +15
stime                                                 37       -     -37
------------------------------------------------------------------------------
(add/remove: 2/2 grow/shrink: 2/0 up/down: 69/-37)             Total: 32 bytes

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agoUpdated inittab example documentation
Denys Vlasenko [Sun, 17 Nov 2019 16:48:53 +0000 (17:48 +0100)]
Updated inittab example documentation

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
4 years agochgrp: correct the usage for non-desktop chgrp calls
Liu, Shuang (ADITG/ESM) [Wed, 13 Nov 2019 14:36:20 +0000 (14:36 +0000)]
chgrp: correct the usage for non-desktop chgrp calls

When IF_DESKTOP is not defined, chown and chgrp only takes option -R -h,
However the usage output of chgrp is wrong:

$ ./busybox.nosuid chown
Usage: chown [-Rh]... USER[:[GRP]] FILE...

$ ./busybox.nosuid chgrp
Usage: chgrp [-RhLHP]... GROUP FILE...

$ ./busybox.nosuid chgrp -H group dummy
chgrp: invalid option -- 'H'
Usage: chgrp [-RhLHP]... GROUP FILE...

The chgrp is now a wrapper of chown, so the recognized options shall be the same.
This is introduced by 34425389e09353a8dacdd6b23a62553f699c544c

I would expect the correct behavior shall be the same as chown.
So suggest the below patch, the behavior shall be:

$ ./busybox.nosuid chgrp
Usage: chgrp [-Rh]... GROUP FILE...

Signed-off-by: Shuang Liu <sliu@de.adit-jv.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotaskset: tighten the check for stride values
Denys Vlasenko [Sat, 9 Nov 2019 16:32:43 +0000 (17:32 +0100)]
taskset: tighten the check for stride values

function                                             old     new   delta
taskset_main                                         986     987      +1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotaskset: implement stride argument
Denys Vlasenko [Sat, 9 Nov 2019 16:05:14 +0000 (17:05 +0100)]
taskset: implement stride argument

function                                             old     new   delta
taskset_main                                         925     986     +61

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agounxz: show -t in --help
Denys Vlasenko [Fri, 8 Nov 2019 15:37:28 +0000 (16:37 +0100)]
unxz: show -t in --help

function                                             old     new   delta
packed_usage                                       33236   33247     +11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotaskset: update comment
Denys Vlasenko [Fri, 8 Nov 2019 15:32:37 +0000 (16:32 +0100)]
taskset: update comment

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotaskset: add support for taking/printing CPU list (-c option)
Denys Vlasenko [Fri, 1 Nov 2019 14:44:49 +0000 (15:44 +0100)]
taskset: add support for taking/printing CPU list (-c option)

function                                             old     new   delta
taskset_main                                         511     855    +344

Based on patch by Fryderyk Wrobel <frd1996@gmail.com>

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agohush: restore redirected stdin
Denys Vlasenko [Fri, 1 Nov 2019 13:16:07 +0000 (14:16 +0100)]
hush: restore redirected stdin

function                                             old     new   delta
restore_redirects                                     52      95     +43
save_fd_on_redirect                                  243     253     +10
hfopen                                                90      99      +9
fgetc_interactive                                    259     261      +2
builtin_type                                         117     115      -2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/1 up/down: 64/-2)              Total: 62 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agontpd: decrease MIN_FREQHOLD by 2, increase "penalty" for largish offset x2
Denys Vlasenko [Wed, 30 Oct 2019 11:13:46 +0000 (12:13 +0100)]
ntpd: decrease MIN_FREQHOLD by 2, increase "penalty" for largish offset x2

> 2018-07-25:
> ntpd: increase MIN_FREQHOLD by 3
> This means we'll start correcting frequency ~5 minutes after start,
> not ~3.5 ones.
> With previous settings I still often see largish ~0.7s initial offsets
> only about 1/2 corrected before frequency correction kicks in,
> resulting in ~200ppm "correction" which is then slowly undone.

Review of real-world results of the above shows that with small
initial offsets, freq correction can be allowed to kick in sooner,
whereas with large (~0.8s) offsets, we still start freq correction
a bit too soon.

Let's rebalance this a bit.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agonslookup: implement support for SRV records
Jo-Philipp Wich [Thu, 27 Jun 2019 15:27:29 +0000 (17:27 +0200)]
nslookup: implement support for SRV records

Add support for querying and parsing SRV DNS records.

function                                             old     new   delta
send_queries                                        1711    1865    +154
qtypes                                                72      80      +8

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agonslookup: handle replies without RRs
Jo-Philipp Wich [Thu, 27 Jun 2019 15:27:28 +0000 (17:27 +0200)]
nslookup: handle replies without RRs

Under some circumstances, a DNS reply might contain no resource records,
e.g. when a valid domain is queried that does not have records of the
requested type.

Example with nslookup from BIND dnsutils:

    $ nslookup -q=SRV example.org
    Server: 10.11.12.13
    Address: 10.11.12.13#53

    Non-authoritative answer:
    *** Can't find example.org: No answer

Currently the busybox nslookup applet simply prints nothing after the
"Non-authoritative answer:" line in the same situation.

This change modifies nslookup to either print "Parse error" or "No answer"
diagnostics, depending on the parse_reply() return value.

function                                             old     new   delta
send_queries                                        1676    1711     +35

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agogunzip: fix incorrect decoding of "fixed" inflate blocks
Denys Vlasenko [Sat, 26 Oct 2019 18:04:34 +0000 (20:04 +0200)]
gunzip: fix incorrect decoding of "fixed" inflate blocks

function                                             old     new   delta
huft_build                                          1008    1022     +14
inflate_block                                       1253    1256      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 17/0)               Total: 17 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agohdparm: placate "warning: taking the absolute value of unsigned type"
Denys Vlasenko [Fri, 25 Oct 2019 15:47:22 +0000 (17:47 +0200)]
hdparm: placate "warning: taking the absolute value of unsigned type"

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agovi: placate "warning: shifting a negative signed value is undefined"
Denys Vlasenko [Fri, 25 Oct 2019 15:42:23 +0000 (17:42 +0200)]
vi: placate "warning: shifting a negative signed value is undefined"

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoread_key(): placate "warning: shifting a negative signed value is undefined"
Denys Vlasenko [Fri, 25 Oct 2019 15:40:57 +0000 (17:40 +0200)]
read_key(): placate "warning: shifting a negative signed value is undefined"

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agontpd: abs(tmx.offset) was truncating a "long" typed value
Denys Vlasenko [Fri, 25 Oct 2019 15:35:58 +0000 (17:35 +0200)]
ntpd: abs(tmx.offset) was truncating a "long" typed value

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotc: array address is never NULL
Denys Vlasenko [Fri, 25 Oct 2019 11:41:31 +0000 (13:41 +0200)]
tc: array address is never NULL

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotraceroute: fix gcc-ism
Denys Vlasenko [Fri, 25 Oct 2019 11:39:41 +0000 (13:39 +0200)]
traceroute: fix gcc-ism

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agosuppress a few "unused function" warnings
Denys Vlasenko [Fri, 25 Oct 2019 11:05:15 +0000 (13:05 +0200)]
suppress a few "unused function" warnings

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agonetstat: suppress a warning (conversion from 'int' to 'smallint' changes value)
Denys Vlasenko [Fri, 25 Oct 2019 11:00:01 +0000 (13:00 +0200)]
netstat: suppress a warning (conversion from 'int' to 'smallint' changes value)

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoMakefile.flags: suppress some clang-9 warnings
Denys Vlasenko [Fri, 25 Oct 2019 10:56:51 +0000 (12:56 +0200)]
Makefile.flags: suppress some clang-9 warnings

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoclang/llvm 9 fix - do not eliminate a store to a fake "const"
Denys Vlasenko [Fri, 25 Oct 2019 10:12:22 +0000 (12:12 +0200)]
clang/llvm 9 fix - do not eliminate a store to a fake "const"

This is *much* better (9 kbytes better) than dropping "*const"
optimization trick.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotar: fix fallout of: change -a from meaning "lzma" to mean "autodetect by extension"
Denys Vlasenko [Fri, 25 Oct 2019 08:30:53 +0000 (10:30 +0200)]
tar: fix fallout of: change -a from meaning "lzma" to mean "autodetect by extension"

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoRemove syscall wrappers around clock_gettime, closes 12091
Denys Vlasenko [Thu, 24 Oct 2019 14:26:55 +0000 (16:26 +0200)]
Remove syscall wrappers around clock_gettime, closes 12091

12091 "Direct use of __NR_clock_gettime is not time64-safe".

function                                             old     new   delta
runsv_main                                          1698    1712     +14
startservice                                         378     383      +5
get_mono                                              31      25      -6
date_main                                            932     926      -6
gettimeofday_ns                                       17       -     -17
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 2/2 up/down: 19/-29)            Total: -10 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoshell: better comments in BASE#nn code
Denys Vlasenko [Tue, 22 Oct 2019 12:25:43 +0000 (14:25 +0200)]
shell: better comments in BASE#nn code

function                                             old     new   delta
evaluate_string                                      932     930      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoshell/ulimit: code shrink
Denys Vlasenko [Mon, 21 Oct 2019 14:47:09 +0000 (16:47 +0200)]
shell/ulimit: code shrink

    text    data     bss     dec     hex filename
1001949     551    5612 1008112   f61f0 busybox_old
1001906     551    5612 1008069   f61c5 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agogunzip: code shrink by using int-, not short-sized struct member
Denys Vlasenko [Sun, 20 Oct 2019 17:07:06 +0000 (19:07 +0200)]
gunzip: code shrink by using int-, not short-sized struct member

function                                             old     new   delta
inflate_block                                       1254    1253      -1
inflate_codes                                        629     621      -8
huft_build                                          1054    1008     -46
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-55)             Total: -55 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agogzip: code shrink
Denys Vlasenko [Sat, 19 Oct 2019 16:52:41 +0000 (18:52 +0200)]
gzip: code shrink

huft_build() still has way too many params

function                                             old     new   delta
lit                                                    -      94     +94
dist                                                   -      94     +94
huft_build                                          1058    1054      -4
inflate_block                                       1281    1254     -27
cpdext                                                30       -     -30
cplext                                                31       -     -31
cpdist                                                60       -     -60
cplens                                                62       -     -62
------------------------------------------------------------------------------
(add/remove: 2/4 grow/shrink: 0/2 up/down: 188/-214)          Total: -26 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agogzip: code shrink
Denys Vlasenko [Sat, 19 Oct 2019 16:33:49 +0000 (18:33 +0200)]
gzip: code shrink

huft_build() has way too many params

function                                             old     new   delta
inflate_block                                       1293    1281     -12
huft_build                                          1085    1058     -27
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-39)             Total: -39 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotelnet: add disabled code to emit EC and IP
Denys Vlasenko [Fri, 18 Oct 2019 14:47:37 +0000 (16:47 +0200)]
telnet: add disabled code to emit EC and IP

> I'm trying to connect to a Korenix 3005 switch through telnet
> for management purposes, and all is well except for the backspace character
> - seems like my switch doesn't handle it too well and instead of erasing
> the last character all it does is print some garbage to the screen.
> I've had the same issue before while using putty, but saw a solution that
> suggests to enable "Telnet special commands" in the options menu, and it
> worked.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobrctl: code shrink
Denys Vlasenko [Tue, 15 Oct 2019 10:31:54 +0000 (12:31 +0200)]
brctl: code shrink

function                                             old     new   delta
show_bridge                                          323     317      -6
brctl_main                                          2171    2164      -7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-13)             Total: -13 bytes
   text    data     bss     dec     hex filename
1002083     551    5612 1008246   f6276 busybox_old
1002065     551    5612 1008228   f6264 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoconfig: PID_FILE_PATH required for FEATURE_CROND_SPECIAL_TIMES
James Byrne [Wed, 17 Jul 2019 15:53:04 +0000 (15:53 +0000)]
config: PID_FILE_PATH required for FEATURE_CROND_SPECIAL_TIMES

When crond is built with FEATURE_CROND_SPECIAL_TIMES enabled, it creates
a file called 'crond.reboot' at CONFIG_PID_FILE_PATH, but if
FEATURE_PIDFILE is disabled, this will be an empty string and the file
will be created in the root directory, which is undesirable.

This commit makes PID_FILE_PATH depend on FEATURE_CROND_SPECIAL_TIMES as
well as FEATURE_PIDFILE so that you get sensible behaviour in crond when
FEATURE_PIDFILE is switched off.

Signed-off-by: James Byrne <james.byrne@origamienergy.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobrctl: tweak help text, fix comments
Denys Vlasenko [Sat, 12 Oct 2019 17:51:46 +0000 (19:51 +0200)]
brctl: tweak help text, fix comments

function                                             old     new   delta
packed_usage                                       33255   33236     -19

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobrctl: fold show_bridge_ports_ into its caller
Denys Vlasenko [Sat, 12 Oct 2019 17:42:37 +0000 (19:42 +0200)]
brctl: fold show_bridge_ports_ into its caller

function                                             old     new   delta
brctl_main                                          2235    2171     -64

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobrctl: code shrink
Denys Vlasenko [Sat, 12 Oct 2019 17:24:38 +0000 (19:24 +0200)]
brctl: code shrink

packed_usage                                       33253   33255      +2
write_uint                                            96      90      -6
show_bridge_timer                                     93      69     -24
brctl_main                                          2338    2235    -103
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/3 up/down: 2/-133)           Total: -131 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobrctl: add support for showstp command
Martin Lewis [Thu, 10 Oct 2019 21:00:19 +0000 (16:00 -0500)]
brctl: add support for showstp command

function                                             old     new   delta
brctl_main                                           974    2339   +1365
show_bridge_timer                                      -      93     +93
static.state_names                                     -      48     +48
printf_xstrtou                                         -      26     +26
packed_usage                                       33243   33253     +10
show_bridge                                          333     323     -10
------------------------------------------------------------------------------
(add/remove: 3/0 grow/shrink: 2/1 up/down: 1542/-10)         Total: 1532 bytes
   text    data     bss     dec     hex filename
 999868     551    5612 1006031   f59cf busybox_old
1002309     551    5612 1008472   f6358 busybox_unstripped

Signed-off-by: Martin Lewis <martin.lewis.x84@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agodpkg-deb: work around bogus error message when working with XZ compressed packages
Denys Vlasenko [Fri, 11 Oct 2019 12:11:44 +0000 (14:11 +0200)]
dpkg-deb: work around bogus error message when working with XZ compressed packages

function                                             old     new   delta
unpack_xz_stream                                    2309    2317      +8
bb_full_fd_action                                    464     472      +8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoreplace: count_strstr - Handle an edge case where sub is empty
Martin Lewis [Sun, 15 Sep 2019 16:51:30 +0000 (18:51 +0200)]
replace: count_strstr - Handle an edge case where sub is empty

If sub is empty, avoids an infinite loop.

function                                             old     new   delta
count_strstr                                          45      63     +18

Signed-off-by: Martin Lewis <martin.lewis.x84@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agolibbb: Converted safe_read to safe_write format
Martin Lewis [Sun, 15 Sep 2019 16:13:28 +0000 (18:13 +0200)]
libbb: Converted safe_read to safe_write format

Changed safe_read to be symmetrical to safe_write, it shall
never return EINTR because it calls read multiple times,
the error is considered transient.

function                                             old     new   delta
safe_read                                             44      57     +13

Signed-off-by: Martin Lewis <martin.lewis.x84@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agorunsv: Use 64 prefix syscall if we have to
Alistair Francis [Wed, 18 Sep 2019 16:28:51 +0000 (09:28 -0700)]
runsv: Use 64 prefix syscall if we have to

Some 32-bit architectures no longer have the 32-bit time_t syscalls.
Instead they have suffixed syscalls that returns a 64-bit time_t. If
the architecture doesn't have the non-suffixed syscall and is using a
64-bit time_t let's use the suffixed syscall instead.

This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel
headers.

If an architecture only supports the suffixed syscalls, but is still
using a 32-bit time_t report a compilation error. This avoids us have to
deal with converting between 64-bit and 32-bit values. There are
currently no architectures where this is the case.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotime: Use 64 prefix syscall if we have to
Alistair Francis [Wed, 18 Sep 2019 16:28:50 +0000 (09:28 -0700)]
time: Use 64 prefix syscall if we have to

Some 32-bit architectures no longer have the 32-bit time_t syscalls.
Instead they have suffixed syscalls that returns a 64-bit time_t. If
the architecture doesn't have the non-suffixed syscall and is using a
64-bit time_t let's use the suffixed syscall instead.

This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel
headers.

If an architecture only supports the suffixed syscalls, but is still
using a 32-bit time_t report a compilation error. This avoids us have to
deal with converting between 64-bit and 32-bit values. There are
currently no architectures where this is the case.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agodate: Use 64 prefix syscall if we have to
Alistair Francis [Wed, 18 Sep 2019 16:28:49 +0000 (09:28 -0700)]
date: Use 64 prefix syscall if we have to

Some 32-bit architectures no longer have the 32-bit time_t syscalls.
Instead they have suffixed syscalls that returns a 64-bit time_t. If
the architecture doesn't have the non-suffixed syscall and is using a
64-bit time_t let's use the suffixed syscall instead.

This fixes build issues when building for RISC-V 32-bit with 5.1+ kernel
headers.

If an architecture only supports the suffixed syscalls, but is still
using a 32-bit time_t fall back to the libc call.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoudhcpc: fix segmentation fault on empty bin opt
Michal Kazior [Wed, 25 Sep 2019 12:03:13 +0000 (14:03 +0200)]
udhcpc: fix segmentation fault on empty bin opt

The following caused udhcpc to segfault:
  busybox udhcpc -i lo -s /dev/null -x 0x3d:

function                                             old     new   delta
udhcp_str2optset                                     629     641     +12

Signed-off-by: Michal Kazior <michal@plume.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobrctl: add support for showmacs command
Martin Lewis [Sun, 15 Sep 2019 16:04:49 +0000 (18:04 +0200)]
brctl: add support for showmacs command

function                                             old     new   delta
brctl_main                                           680     974    +294
packed_usage                                       33167   33187     +20
compare_fdbs                                           -      19     +19
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/0 up/down: 333/0)             Total: 333 bytes

Signed-off-by: Martin Lewis <martin.lewis.x84@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoln: --no-target-directory implies --no-dereference
Kaarle Ritvanen [Tue, 8 Oct 2019 12:07:50 +0000 (14:07 +0200)]
ln: --no-target-directory implies --no-dereference

as in GNU coreutils

Signed-off-by: Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoroute: fix output of "route -n -A inet6"
Tomas Paukrt [Tue, 8 Oct 2019 09:51:48 +0000 (11:51 +0200)]
route: fix output of "route -n -A inet6"

The output of the command "route -n -A inet6" may be corrupted
due to partially initialized structure snaddr6 in the function
INET6_displayroutes.

Signed-off-by: Tomas Paukrt <tomaspaukrt@email.cz>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotee: do not intercept SIGPIPE
Denys Vlasenko [Mon, 7 Oct 2019 12:25:45 +0000 (14:25 +0200)]
tee: do not intercept SIGPIPE

GNU tee does this only with -p, which we don't have yet.

function                                             old     new   delta
tee_main                                             306     295     -11

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