oweals/busybox.git
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>
6 years agotar: fix a thinko in prev commit - we need to copy to _unused_ fd
Denys Vlasenko [Sat, 4 Aug 2018 19:06:02 +0000 (21:06 +0200)]
tar: fix a thinko in prev commit - we need to copy to _unused_ fd

function                                             old     new   delta
vfork_compressor                                     257     246     -11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotar: handle the case when opened created tarball happens to have fd#0
Denys Vlasenko [Sat, 4 Aug 2018 16:15:19 +0000 (18:15 +0200)]
tar: handle the case when opened created tarball happens to have fd#0

Reproducer:
    exec 0>&-
    exec 1>&-
    tar czf z.tar.gz FILE

function                                             old     new   delta
vfork_compressor                                     229     257     +28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotar: make source code a bit more terse, no logic changes
Denys Vlasenko [Sat, 4 Aug 2018 15:48:59 +0000 (17:48 +0200)]
tar: make source code a bit more terse, no logic changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agouptime: add -s support
Denys Vlasenko [Fri, 3 Aug 2018 17:53:49 +0000 (19:53 +0200)]
uptime: add -s support

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoComplie libbb/duration.c if ping[6] is selected
Denys Vlasenko [Fri, 3 Aug 2018 16:51:46 +0000 (18:51 +0200)]
Complie libbb/duration.c if ping[6] is selected

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoping: implement -i SEC
Denys Vlasenko [Fri, 3 Aug 2018 16:50:50 +0000 (18:50 +0200)]
ping: implement -i SEC

function                                             old     new   delta
common_ping_main                                    1862    1968    +106
ualarm                                                 -      79     +79
packed_usage                                       32858   32897     +39
sendping_tail                                        204     218     +14
------------------------------------------------------------------------------
(add/remove: 5/0 grow/shrink: 3/0 up/down: 320/0)             Total: 320 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agotimeout: fix arguments to match coreutils
Denys Vlasenko [Fri, 3 Aug 2018 16:27:00 +0000 (18:27 +0200)]
timeout: fix arguments to match coreutils

Was: timeout [-t SECS] [-s SIG] PROG ARGS
Is:  timeout [-s SIG] SECS PROG ARGS

function                                             old     new   delta
timeout_main                                         312     319      +7
packed_usage                                       32882   32858     -24
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 7/-24)             Total: -17 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoextend fractional duration support to "top -d N.N" and "timeout"
Denys Vlasenko [Fri, 3 Aug 2018 16:17:12 +0000 (18:17 +0200)]
extend fractional duration support to "top -d N.N" and "timeout"

function                                             old     new   delta
parse_duration_str                                     -     168    +168
sleep_for_duration                                     -     157    +157
top_main                                             885     928     +43
timeout_main                                         269     312     +43
handle_input                                         571     614     +43
duration_suffixes                                      -      40     +40
sfx                                                   40       -     -40
sleep_main                                           364      79    -285
------------------------------------------------------------------------------
(add/remove: 4/1 grow/shrink: 3/1 up/down: 494/-325)          Total: 169 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agontpd: show real, unclamped delays on low-latency networks
Denys Vlasenko [Fri, 3 Aug 2018 09:03:55 +0000 (11:03 +0200)]
ntpd: show real, unclamped delays on low-latency networks

On fast network, I've seen "delay:0.002000" shown for all packets,
thus completely losing information on what real delays are.

The new code is careful to not reject packets with tiny delays
if the delay "grows a lot" but is still tiny:
0.000009 is "much larger" than 0.000001 (nine times larger),
but is still very good small delay.

function                                             old     new   delta
recv_and_process_peer_pkt                            863     889     +26

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agols: When -h is passed, the total should also be in human units
Lauri Kasanen [Wed, 1 Aug 2018 16:51:17 +0000 (19:51 +0300)]
ls: When -h is passed, the total should also be in human units

Signed-off-by: Lauri Kasanen <cand@gmx.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agonslookup: add support for search domains, closes 11161
Denys Vlasenko [Wed, 1 Aug 2018 17:42:46 +0000 (19:42 +0200)]
nslookup: add support for search domains, closes 11161

function                                             old     new   delta
parse_resolvconf                                       -     311    +311
add_query_with_search                                  -     105    +105
nslookup_main                                        873     757    -116
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 0/1 up/down: 416/-116)          Total: 300 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agocp: placate gcc8
Denys Vlasenko [Wed, 1 Aug 2018 16:29:41 +0000 (18:29 +0200)]
cp: placate gcc8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoAdd chroot support to chpasswd
Jon Kolb [Wed, 1 Aug 2018 01:30:24 +0000 (21:30 -0400)]
Add chroot support to chpasswd

function                                             old     new   delta
.rodata                                           170689  170724     +35
packed_usage                                       32850   32876     +26
chpasswd_main                                        411     436     +25
chpasswd_longopts                                     34      41      +7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/0 up/down: 93/0)               Total: 93 bytes

Signed-off-by: Jon Kolb <kolbyjack@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoudhcpc: add a cooment about sanitizing DHCP_DOMAIN_NAME, no code changes
Denys Vlasenko [Wed, 1 Aug 2018 11:36:36 +0000 (13:36 +0200)]
udhcpc: add a cooment about sanitizing DHCP_DOMAIN_NAME, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoudhcpc: do in fact not allow hostname components which start with dash
Denys Vlasenko [Wed, 1 Aug 2018 11:16:05 +0000 (13:16 +0200)]
udhcpc: do in fact not allow hostname components which start with dash

function                                             old     new   delta
xmalloc_optname_optval                               879     893     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosendmail: use on-stack buffer for AUTH PLAIN
Denys Vlasenko [Tue, 31 Jul 2018 16:07:20 +0000 (18:07 +0200)]
sendmail: use on-stack buffer for AUTH PLAIN

function                                             old     new   delta
sendmail_main                                       1335    1307     -28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosendmail: code shrink 2
Denys Vlasenko [Tue, 31 Jul 2018 15:36:31 +0000 (17:36 +0200)]
sendmail: code shrink 2

function                                             old     new   delta
sendmail_main                                       1366    1335     -31

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosendfile: code shrink
Denys Vlasenko [Tue, 31 Jul 2018 15:30:08 +0000 (17:30 +0200)]
sendfile: code shrink

function                                             old     new   delta
printstr_base64                                        -      22     +22
printbuf_base64                                        -      11     +11
printfile_base64                                       -       9      +9
makemime_main                                        305     294     -11
encode_n_base64                                      236     223     -13
sendmail_main                                       1380    1366     -14
encode_base64                                         36       -     -36
------------------------------------------------------------------------------
(add/remove: 3/1 grow/shrink: 0/3 up/down: 42/-74)            Total: -32 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agosendmail: support AUTH PLAIN in addition to AUTH LOGIN
Raffaello D. Di Napoli [Tue, 26 Jun 2018 23:17:45 +0000 (19:17 -0400)]
sendmail: support AUTH PLAIN in addition to AUTH LOGIN

Implement the -am argument to allow choosing an AUTH method.
For now only PLAIN and LOGIN are supported, but others can be added
easily in the future.

AUTH PLAIN required adding a new variant of encode_base64() capable of
handling NUL characters in the input string; the old function is now a
wrapper for the newer one.

function                                             old     new   delta
encode_n_base64                                        -     236    +236
sendmail_main                                       1199    1380    +181
packed_usage                                       32873   32877      +4
encode_base64                                        242      36    -206
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 2/1 up/down: 421/-206)          Total: 215 bytes

Signed-off-by: Raffaello D. Di Napoli <rafdev@dinapo.li>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoklogd: code shrink
Denys Vlasenko [Tue, 31 Jul 2018 14:50:26 +0000 (16:50 +0200)]
klogd: code shrink

function                                             old     new   delta
klogd_main                                           511     486     -25

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoinstall.sh: don't clobber dangling symlinks
Baruch Siach [Tue, 17 Jul 2018 10:40:45 +0000 (13:40 +0300)]
install.sh: don't clobber dangling symlinks

Symlinks in a subdirectory that is to become target rootfs are sometimes
dangling because they link to canonical file names that are not present
on the host, but are present relative to the target rootfs root. Don't
copy over dangling symlinks when noclobber is enabled

The -e test treats dangling symlinks as non-existent files. Add -h test
that returns true for all symlinks.

Cc: Yann E. MORIN <yann.morin.1998@free.fr>
Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoklogd: better help text
Denys Vlasenko [Tue, 31 Jul 2018 13:25:00 +0000 (15:25 +0200)]
klogd: better help text

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: speed up ${var:+ARG} for literal ARGs
Denys Vlasenko [Tue, 31 Jul 2018 08:36:29 +0000 (10:36 +0200)]
hush: speed up ${var:+ARG} for literal ARGs

function                                             old     new   delta
first_special_char_in_vararg                           -      52     +52
expand_one_var                                      2248    2296     +48
encode_then_expand_vararg                            357     336     -21
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 100/-21)            Total: 79 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix another case where empty "for" wasn't setting exitcode to 0
Denys Vlasenko [Sat, 28 Jul 2018 10:42:08 +0000 (12:42 +0200)]
hush: fix another case where empty "for" wasn't setting exitcode to 0

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: disable debug_indent increment/decrement for HUSH_DEBUG < 2 builds
Denys Vlasenko [Sat, 28 Jul 2018 10:16:30 +0000 (12:16 +0200)]
hush: disable debug_indent increment/decrement for HUSH_DEBUG < 2 builds

function                                             old     new   delta
run_list                                            1063    1046     -17
parse_stream                                        2296    2249     -47
run_pipe                                            1890    1840     -50
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-114)           Total: -114 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: make "set -x" output don't redirectable when fd#2 redirected
Denys Vlasenko [Sat, 28 Jul 2018 10:13:58 +0000 (12:13 +0200)]
hush: make "set -x" output don't redirectable when fd#2 redirected

function                                             old     new   delta
x_mode_print_optionally_squoted                        -     120    +120
x_mode_flush                                           -      68     +68
save_fd_on_redirect                                  208     243     +35
x_mode_prefix                                          -      27     +27
x_mode_addblock                                        -      23     +23
x_mode_addchr                                          -      17     +17
dump_cmd_in_x_mode                                   110      85     -25
run_pipe                                            1919    1890     -29
print_optionally_squoted                             145       -    -145
------------------------------------------------------------------------------
(add/remove: 5/1 grow/shrink: 1/2 up/down: 290/-199)           Total: 91 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: make "set -x" output closer to bash
Denys Vlasenko [Fri, 27 Jul 2018 15:42:38 +0000 (17:42 +0200)]
hush: make "set -x" output closer to bash

function                                             old     new   delta
print_optionally_squoted                               -     145    +145
run_pipe                                            1902    1919     +17
dump_cmd_in_x_mode                                   142     110     -32
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 162/-32)           Total: 130 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix "set -x" output prefix overlapping for v="..`cmd`.." case
Denys Vlasenko [Fri, 27 Jul 2018 12:12:05 +0000 (14:12 +0200)]
hush: fix "set -x" output prefix overlapping for v="..`cmd`.." case

Was printing initial "+" prefix for the assignment, that printing

"+ cmd"

then printing the expanded " v=VAL" string.

Delay printing of "+" prefix for the assignment to after expansion.

function                                             old     new   delta
run_pipe                                            1883    1902     +19
builtin_eval                                         127     133      +6
expand_vars_to_list                                 1103    1106      +3
dump_cmd_in_x_mode                                   144     142      -2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/1 up/down: 28/-2)              Total: 26 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: in some cases, expand_on_ifs() relied of uninitialized memory
Denys Vlasenko [Fri, 27 Jul 2018 10:14:39 +0000 (12:14 +0200)]
hush: in some cases, expand_on_ifs() relied of uninitialized memory

The n > 0 check to prevent access to the last byte of non-existing argv[-1]
wasn't enough. Switched to making sure there are initialized (zero) bytes there.

A predictable testcase is rather hard to construct, unfortunately,
contents of memory depends on allocator behavior and whatnot.

function                                             old     new   delta
o_save_ptr_helper                                    119     137     +18
expand_on_ifs                                        345     339      -6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 18/-6)              Total: 12 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: improve set -x: make "+++" indent level increase in `cmd` and eval.
Denys Vlasenko [Thu, 26 Jul 2018 13:21:50 +0000 (15:21 +0200)]
hush: improve set -x: make "+++" indent level increase in `cmd` and eval.

function                                             old     new   delta
dump_cmd_in_x_mode                                   126     144     +18
run_pipe                                            1873    1883     +10
builtin_eval                                         119     127      +8
expand_vars_to_list                                 1100    1103      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 4/0 up/down: 39/0)               Total: 39 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agoexamples/var_service: add /var/run flag file to ntp.script
Denys Vlasenko [Thu, 26 Jul 2018 11:45:33 +0000 (13:45 +0200)]
examples/var_service: add /var/run flag file to ntp.script

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohtpd: increase MIN_FREQHOLD by 3
Denys Vlasenko [Wed, 25 Jul 2018 12:58:49 +0000 (14:58 +0200)]
htpd: increase MIN_FREQHOLD by 3

This means we'll start correcting frequency ~5 minutes after start,
not ~3.5 ones.

With previos 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.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agofdisk: code shrink
Denys Vlasenko [Wed, 25 Jul 2018 12:42:53 +0000 (14:42 +0200)]
fdisk: code shrink

function                                             old     new   delta
get_nonexisting_partition                            119     104     -15
fdisk_main                                          2640    2622     -18
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-33)             Total: -33 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agofdisk: sync up with some util-linux 2.31 behavior
Denys Vlasenko [Wed, 25 Jul 2018 11:45:36 +0000 (13:45 +0200)]
fdisk: sync up with some util-linux 2.31 behavior

= display default is no longer in cylinders
= +sizeC is no longer supported
= add +sizeT suffix - terabytes are here
= K,M,G,T and k,m,g,t suffixes all are binary, not decimal
= +sizeM results in last sector +(size * 1Mbyte - 1), not +(size * 1Mbyte)
= fix comparison to "YES" answer for sgi/sun

function                                             old     new   delta
read_int                                             492     519     +27
fdisk_main                                          2644    2640      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 27/-4)              Total: 23 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agofdisk: use strtoul[l] instead of atoi, closes 11176
Denys Vlasenko [Wed, 25 Jul 2018 10:08:26 +0000 (12:08 +0200)]
fdisk: use strtoul[l] instead of atoi, closes 11176

Couldn't create partitions bigger than 1TB (when using 512 bytes sectors,
on 32 bits architectures).

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agogzip: unbreak FEATURE_GZIP_LEVELS, closes 11171
Denys Vlasenko [Tue, 24 Jul 2018 19:12:58 +0000 (21:12 +0200)]
gzip: unbreak FEATURE_GZIP_LEVELS, closes 11171

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix/explain corner cases of redirection colliding with script fd
Denys Vlasenko [Tue, 24 Jul 2018 16:01:22 +0000 (18:01 +0200)]
hush: fix/explain corner cases of redirection colliding with script fd

function                                             old     new   delta
save_fd_on_redirect                                  200     208      +8
run_pipe                                            1870    1873      +3
setup_redirects                                      321     322      +1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 12/0)               Total: 12 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: add "heredoc.tests" from ash, tweak ash "is a function" message
Denys Vlasenko [Tue, 24 Jul 2018 15:08:04 +0000 (17:08 +0200)]
hush: add "heredoc.tests" from ash, tweak ash "is a function" message

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix nested redirects colliding with script fds
Denys Vlasenko [Tue, 24 Jul 2018 14:54:41 +0000 (16:54 +0200)]
hush: fix nested redirects colliding with script fds

This necessitates switch from libc FILE api to a simple
homegrown replacement.
The change which fixes the bug here is the deleting of

restore_redirected_FILEs();

line. It was prematurely moving (restoring) script fd#3.
The fix is: we don't even _want_ to restore scrit fds,
we are perfectly fine with them being moved.
The only reason we tried to restore them is that FILE api
did not allow moving of FILE->fd.

function                                             old     new   delta
refill_HFILE_and_getc                                  -      93     +93
hfopen                                                 -      90     +90
hfclose                                                -      66     +66
pseudo_exec_argv                                     591     597      +6
hush_main                                           1089    1095      +6
builtin_source                                       209     214      +5
save_fd_on_redirect                                  197     200      +3
setup_redirects                                      320     321      +1
fgetc_interactive                                    235     236      +1
i_peek_and_eat_bkslash_nl                             99      97      -2
expand_vars_to_list                                 1103    1100      -3
restore_redirects                                     99      52     -47
fclose_and_forget                                     57       -     -57
remember_FILE                                         63       -     -63
------------------------------------------------------------------------------
(add/remove: 3/2 grow/shrink: 6/3 up/down: 271/-172)           Total: 99 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: handle backslash-newline in heredoc terminators
Denys Vlasenko [Tue, 24 Jul 2018 12:03:18 +0000 (14:03 +0200)]
hush: handle backslash-newline in heredoc terminators

function                                             old     new   delta
fetch_heredocs                                       479     527     +48

(ash fails this test)

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix handling of heredocs not enclosed in groups where they are "declared"
Denys Vlasenko [Tue, 24 Jul 2018 11:03:03 +0000 (13:03 +0200)]
hush: fix handling of heredocs not enclosed in groups where they are "declared"

function                                             old     new   delta
fetch_heredocs                                         -     479    +479
parse_and_run_stream                                 146     148      +2
parse_stream                                        2787    2296    -491
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/1 up/down: 481/-491)          Total: -10 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix heredoc handling in the "cmd <<EOF ;<newline>" case
Denys Vlasenko [Mon, 23 Jul 2018 14:31:21 +0000 (16:31 +0200)]
hush: fix heredoc handling in the "cmd <<EOF ;<newline>" case

function                                             old     new   delta
parse_stream                                        2759    2787     +28

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix handling of heredocs starting with empty lines
Denys Vlasenko [Mon, 23 Jul 2018 13:43:57 +0000 (15:43 +0200)]
hush: fix handling of heredocs starting with empty lines

function                                             old     new   delta
parse_stream                                        2748    2759     +11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohexedit: fixes for redraw and down movement causing SEGV on attempt to access
Denys Vlasenko [Mon, 23 Jul 2018 12:21:07 +0000 (14:21 +0200)]
hexedit: fixes for redraw and down movement causing SEGV on attempt to access

"Go to:" command was not updating row position, making next "down" movements
for one screenful print empty lines instead of showing the contents.

If the file is whole pages long, "down" movement at EOF was advancing position
+16 bytes, mapping the next portion (entirely past the end of the file),
then finding out that the new position is beyond the EOF, rolling it back
-16 bytes... ending up with this postion pointing *before* the mapped portion.
Any next access (e.g. "move right" key) SEGVs.

function                                             old     new   delta
hexedit_main                                        1170    1184     +14

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: never glob result of dquoted "${v:+/bin/c*}"
Denys Vlasenko [Fri, 20 Jul 2018 17:29:41 +0000 (19:29 +0200)]
hush: never glob result of dquoted "${v:+/bin/c*}"

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: tidy up code after previous commits
Denys Vlasenko [Fri, 20 Jul 2018 17:11:09 +0000 (19:11 +0200)]
hush: tidy up code after previous commits

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: better names for o_free_unsafe() / o_free(), no logic changes
Denys Vlasenko [Fri, 20 Jul 2018 15:51:31 +0000 (17:51 +0200)]
hush: better names for o_free_unsafe() / o_free(), no logic changes

o_free() made o_string NULL-initialized,
o_free_unsafe() did not bother reinitializing (expected caller to not need it).

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix handling of '' in ${var:+ARG}
Denys Vlasenko [Fri, 20 Jul 2018 15:36:06 +0000 (17:36 +0200)]
hush: fix handling of '' in ${var:+ARG}

This wasn't an ash bug in dollar_altvalue9, it was hush bug (and bash!)

function                                             old     new   delta
expand_one_var                                      2236    2254     +18
expand_vars_to_list                                 1097    1103      +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 24/0)               Total: 24 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix word splitting in ${v:+ARG} - dollar_altvalue1 test
Denys Vlasenko [Fri, 20 Jul 2018 14:18:59 +0000 (16:18 +0200)]
hush: fix word splitting in ${v:+ARG} - dollar_altvalue1 test

ash might be a bit buggy, need to investigate dollar_altvalue9 test

function                                             old     new   delta
expand_one_var                                      1639    2236    +597
expand_variables                                     112     128     +16
expand_vars_to_list                                 1117    1097     -20
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 613/-20)           Total: 593 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: expand_vars_to_list() should not assume it starts new word
Denys Vlasenko [Fri, 20 Jul 2018 12:45:12 +0000 (14:45 +0200)]
hush: expand_vars_to_list() should not assume it starts new word

function                                             old     new   delta
expand_variables                                     112     115      +3
expand_vars_to_list                                 1117    1108      -9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 3/-9)               Total: -6 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: remove pointless "next" var, simplify expand_vars_to_list()
Denys Vlasenko [Fri, 20 Jul 2018 12:24:56 +0000 (14:24 +0200)]
hush: remove pointless "next" var, simplify expand_vars_to_list()

function                                             old     new   delta
o_addstr                                               -      26     +26
expand_vars_to_list                                 1112    1117      +5
encode_then_expand_vararg                            398     382     -16
parse_dollar                                         779     762     -17
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/2 up/down: 31/-33)             Total: -2 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: store "ended_in_ifs" flag in o_string
Denys Vlasenko [Thu, 19 Jul 2018 11:45:54 +0000 (13:45 +0200)]
hush: store "ended_in_ifs" flag in o_string

This simplifies function parameter passing.

function                                             old     new   delta
expand_one_var                                      1643    1639      -4
append_str_maybe_ifs_split                            64      52     -12
expand_vars_to_list                                 1125    1112     -13
expand_on_ifs                                        361     345     -16
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-45)             Total: -45 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: propagate (output,n) parameters into expand_one_var()
Denys Vlasenko [Thu, 19 Jul 2018 10:14:47 +0000 (12:14 +0200)]
hush: propagate (output,n) parameters into expand_one_var()

This is necessary since expand_one_var() for ${var:+ARG} must create more than one
output word, and thus can't simply return a char*.

function                                             old     new   delta
expand_one_var                                      1610    1643     +33
expand_vars_to_list                                 1139    1125     -14
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 33/-14)             Total: 19 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: make expand_vars_to_list() a bit more sane
Denys Vlasenko [Thu, 19 Jul 2018 09:16:53 +0000 (11:16 +0200)]
hush: make expand_vars_to_list() a bit more sane

function                                             old     new   delta
append_str_maybe_ifs_split                             -      64     +64
expand_vars_to_list                                 1167    1139     -28
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/1 up/down: 64/-28)             Total: 36 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: reduce indentation, no code changes
Denys Vlasenko [Wed, 18 Jul 2018 14:12:23 +0000 (16:12 +0200)]
hush: reduce indentation, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: fix 'x=; echo ${x:-"$@"}' producing 'BUG in varexp2' message
Denys Vlasenko [Wed, 18 Jul 2018 14:02:25 +0000 (16:02 +0200)]
hush: fix 'x=; echo ${x:-"$@"}' producing 'BUG in varexp2' message

function                                             old     new   delta
expand_string_to_string                              126     128      +2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: smaller code to set o_string to ""
Denys Vlasenko [Wed, 18 Jul 2018 13:48:53 +0000 (15:48 +0200)]
hush: smaller code to set o_string to ""

function                                             old     new   delta
encode_then_expand_vararg                            399     398      -1
parse_stream                                        2753    2748      -5

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agowhitespace fixes
Denys Vlasenko [Tue, 17 Jul 2018 13:04:17 +0000 (15:04 +0200)]
whitespace fixes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: faster/smaller code to check for presense of multiple chars in string
Denys Vlasenko [Tue, 17 Jul 2018 12:33:19 +0000 (14:33 +0200)]
hush: faster/smaller code to check for presense of multiple chars in string

Go over the string only once.

function                                             old     new   delta
encode_then_expand_string                            126     105     -21
encode_then_expand_vararg                            443     399     -44
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-65)             Total: -65 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
6 years agohush: improve ${var#...}, ${var:+...} and ${var/.../...} - handle quoting
Denys Vlasenko [Tue, 17 Jul 2018 12:21:38 +0000 (14:21 +0200)]
hush: improve ${var#...}, ${var:+...} and ${var/.../...} - handle quoting

dollar_altvalue1 test partially fails: word splitting of unquoted ${var:+...}
is not correct

function                                             old     new   delta
encode_then_expand_vararg                              -     443    +443
expand_one_var                                      1599    1610     +11
parse_stream                                        2756    2753      -3
encode_string                                        250     242      -8
setup_heredoc                                        308     298     -10
expand_and_evaluate_arith                            106      96     -10
encode_then_expand_string                            142     126     -16
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/5 up/down: 454/-47)           Total: 407 bytes

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