mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-09 14:06:58 +02:00
busybox: import current stable from upstream Gentoo
BUG=None TEST=updated busybox, created a recovery image, booted it, recovered system, booted recovered system Change-Id: I7f7a5389ed0ec63f807cbd0d4aee4f0fbde192ee Reviewed-on: http://gerrit.chromium.org/gerrit/6736 Tested-by: Mike Frysinger <vapier@chromium.org> Reviewed-by: Anush Elangovan <anush@chromium.org> Reviewed-by: David James <davidjames@chromium.org> Reviewed-by: Nick Sanders <nsanders@chromium.org> Reviewed-by: Hung-Te Lin <hungte@chromium.org> Reviewed-by: Richard Barnette <jrbarnette@chromium.org>
This commit is contained in:
parent
b149f19a2d
commit
ca2b2968a3
@ -1,6 +1,6 @@
|
|||||||
# Copyright 1999-2011 Gentoo Foundation
|
# Copyright 1999-2011 Gentoo Foundation
|
||||||
# Distributed under the terms of the GNU General Public License v2
|
# Distributed under the terms of the GNU General Public License v2
|
||||||
# $Header: /data/temp/gentoo//vcs-public-cvsroot/gentoo-x86/sys-apps/busybox/busybox-1.18.5.ebuild,v 1.1 2011/08/07 21:08:47 vapier Exp $
|
# $Header: /var/cvsroot/gentoo-x86/sys-apps/busybox/busybox-1.19.0.ebuild,v 1.6 2011/08/24 19:18:38 maekke Exp $
|
||||||
|
|
||||||
EAPI="3"
|
EAPI="3"
|
||||||
inherit eutils flag-o-matic savedconfig toolchain-funcs
|
inherit eutils flag-o-matic savedconfig toolchain-funcs
|
||||||
@ -57,7 +57,7 @@ else
|
|||||||
fi
|
fi
|
||||||
LICENSE="GPL-2"
|
LICENSE="GPL-2"
|
||||||
SLOT="0"
|
SLOT="0"
|
||||||
KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-linux"
|
KEYWORDS="~alpha amd64 arm hppa ~ia64 ~m68k ~mips ppc ppc64 ~s390 ~sh ~sparc x86 ~x86-linux"
|
||||||
IUSE="debug ipv6 make-symlinks +mdev nfs -pam selinux static elibc_glibc"
|
IUSE="debug ipv6 make-symlinks +mdev nfs -pam selinux static elibc_glibc"
|
||||||
RESTRICT="test"
|
RESTRICT="test"
|
||||||
|
|
||||||
@ -84,11 +84,12 @@ busybox_config_option() {
|
|||||||
src_prepare() {
|
src_prepare() {
|
||||||
unset KBUILD_OUTPUT #88088
|
unset KBUILD_OUTPUT #88088
|
||||||
append-flags -fno-strict-aliasing #310413
|
append-flags -fno-strict-aliasing #310413
|
||||||
|
use ppc64 && append-flags -mminimal-toc #130943
|
||||||
append-cppflags $($(tc-getPKG_CONFIG) libtirpc --cflags)
|
append-cppflags $($(tc-getPKG_CONFIG) libtirpc --cflags)
|
||||||
|
|
||||||
# patches go here!
|
# patches go here!
|
||||||
epatch "${FILESDIR}"/busybox-1.18.0-bb.patch
|
#epatch "${FILESDIR}"/busybox-1.19.0-bb.patch
|
||||||
#epatch "${FILESDIR}"/busybox-${PV}-*.patch
|
epatch "${FILESDIR}"/busybox-${PV}-*.patch
|
||||||
|
|
||||||
# flag cleanup
|
# flag cleanup
|
||||||
sed -i -r \
|
sed -i -r \
|
||||||
@ -252,7 +253,7 @@ pkg_preinst() {
|
|||||||
ewarn "setting USE=make-symlinks and emerging to / is very dangerous."
|
ewarn "setting USE=make-symlinks and emerging to / is very dangerous."
|
||||||
ewarn "it WILL overwrite lots of system programs like: ls bash awk grep (bug 60805 for full list)."
|
ewarn "it WILL overwrite lots of system programs like: ls bash awk grep (bug 60805 for full list)."
|
||||||
ewarn "If you are creating a binary only and not merging this is probably ok."
|
ewarn "If you are creating a binary only and not merging this is probably ok."
|
||||||
ewarn "set env VERY_BRAVE_OR_VERY_DUMB=yes if this is realy what you want."
|
ewarn "set env VERY_BRAVE_OR_VERY_DUMB=yes if this is really what you want."
|
||||||
die "silly options will destroy your system"
|
die "silly options will destroy your system"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -269,9 +270,7 @@ pkg_postinst() {
|
|||||||
cp -vpPR _install/* "${ROOT}"/ || die "copying links for ${x} failed"
|
cp -vpPR _install/* "${ROOT}"/ || die "copying links for ${x} failed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo
|
elog "This ebuild has support for user defined configs"
|
||||||
einfo "This ebuild has support for user defined configs"
|
elog "Please read this ebuild for more details and re-emerge as needed"
|
||||||
einfo "Please read this ebuild for more details and re-emerge as needed"
|
elog "if you want to add or remove functionality for ${PN}"
|
||||||
einfo "if you want to add or remove functionality for ${PN}"
|
|
||||||
echo
|
|
||||||
}
|
}
|
@ -1,23 +0,0 @@
|
|||||||
--- a/include/applets.src.h
|
|
||||||
+++ b/include/applets.src.h
|
|
||||||
@@ -77,7 +77,9 @@
|
|
||||||
IF_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, _BB_SUID_DROP, basename))
|
|
||||||
IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, _BB_DIR_BIN, _BB_SUID_DROP, bash))
|
|
||||||
IF_FEATURE_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, _BB_DIR_BIN, _BB_SUID_DROP, bash))
|
|
||||||
+IF_ASH(APPLET_ODDNAME(bb, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
|
|
||||||
IF_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_DROP))
|
|
||||||
+IF_ASH(APPLET_ODDNAME(bbsh, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
|
|
||||||
//IF_BBSH(APPLET(bbsh, _BB_DIR_BIN, _BB_SUID_DROP))
|
|
||||||
IF_BEEP(APPLET(beep, _BB_DIR_USR_BIN, _BB_SUID_DROP))
|
|
||||||
IF_BLKID(APPLET(blkid, _BB_DIR_SBIN, _BB_SUID_DROP))
|
|
||||||
--- a/shell/ash.c
|
|
||||||
+++ b/shell/ash.c
|
|
||||||
@@ -7255,6 +7255,8 @@
|
|
||||||
}
|
|
||||||
/* re-exec ourselves with the new arguments */
|
|
||||||
execve(bb_busybox_exec_path, argv, envp);
|
|
||||||
+ execve("/bin/busybox.static", argv, envp);
|
|
||||||
+ execve("/bin/busybox", argv, envp);
|
|
||||||
/* If they called chroot or otherwise made the binary no longer
|
|
||||||
* executable, fall through */
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
diff -urpN busybox-1.18.1/archival/bzip2.c busybox-1.18.1-bzip2/archival/bzip2.c
|
|
||||||
--- busybox-1.18.1/archival/bzip2.c 2010-12-20 01:41:26.000000000 +0100
|
|
||||||
+++ busybox-1.18.1-bzip2/archival/bzip2.c 2010-12-30 04:43:11.000000000 +0100
|
|
||||||
@@ -128,10 +128,12 @@ IF_DESKTOP(long long) int FAST_FUNC comp
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#if ENABLE_FEATURE_CLEAN_UP
|
|
||||||
+ /* Can't be conditional on ENABLE_FEATURE_CLEAN_UP -
|
|
||||||
+ * we are called repeatedly
|
|
||||||
+ */
|
|
||||||
BZ2_bzCompressEnd(strm);
|
|
||||||
free(iobuf);
|
|
||||||
-#endif
|
|
||||||
+
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
diff -urpN busybox-1.18.1/archival/libarchive/bz/bzlib.c busybox-1.18.1-bzip2/archival/libarchive/bz/bzlib.c
|
|
||||||
--- busybox-1.18.1/archival/libarchive/bz/bzlib.c 2010-12-20 01:41:26.000000000 +0100
|
|
||||||
+++ busybox-1.18.1-bzip2/archival/libarchive/bz/bzlib.c 2010-12-30 04:43:11.000000000 +0100
|
|
||||||
@@ -361,7 +361,6 @@ int BZ2_bzCompress(bz_stream *strm, int
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
-#if ENABLE_FEATURE_CLEAN_UP
|
|
||||||
static
|
|
||||||
void BZ2_bzCompressEnd(bz_stream *strm)
|
|
||||||
{
|
|
||||||
@@ -372,9 +371,8 @@ void BZ2_bzCompressEnd(bz_stream *strm)
|
|
||||||
free(s->arr2);
|
|
||||||
free(s->ftab);
|
|
||||||
free(s->crc32table);
|
|
||||||
- free(strm->state);
|
|
||||||
+ free(s);
|
|
||||||
}
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
@ -1,20 +0,0 @@
|
|||||||
diff -urpN busybox-1.18.1/archival/cpio.c busybox-1.18.1-cpio/archival/cpio.c
|
|
||||||
--- busybox-1.18.1/archival/cpio.c 2010-12-20 01:41:26.000000000 +0100
|
|
||||||
+++ busybox-1.18.1-cpio/archival/cpio.c 2010-12-26 02:26:38.000000000 +0100
|
|
||||||
@@ -308,16 +308,12 @@ int cpio_main(int argc UNUSED_PARAM, cha
|
|
||||||
/* -L makes sense only with -o or -p */
|
|
||||||
|
|
||||||
#if !ENABLE_FEATURE_CPIO_O
|
|
||||||
- /* no parameters */
|
|
||||||
- opt_complementary = "=0";
|
|
||||||
opt = getopt32(argv, OPTION_STR, &cpio_filename);
|
|
||||||
argv += optind;
|
|
||||||
if (opt & CPIO_OPT_FILE) { /* -F */
|
|
||||||
xmove_fd(xopen(cpio_filename, O_RDONLY), STDIN_FILENO);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
- /* _exactly_ one parameter for -p, thus <= 1 param if -p is allowed */
|
|
||||||
- opt_complementary = ENABLE_FEATURE_CPIO_P ? "?1" : "=0";
|
|
||||||
opt = getopt32(argv, OPTION_STR "oH:" IF_FEATURE_CPIO_P("p"), &cpio_filename, &cpio_fmt);
|
|
||||||
argv += optind;
|
|
||||||
if ((opt & (CPIO_OPT_FILE|CPIO_OPT_CREATE)) == CPIO_OPT_FILE) { /* -F without -o */
|
|
@ -1,259 +0,0 @@
|
|||||||
diff -urpN busybox-1.18.1/shell/hush.c busybox-1.18.1-hush/shell/hush.c
|
|
||||||
--- busybox-1.18.1/shell/hush.c 2010-12-21 05:31:04.000000000 +0100
|
|
||||||
+++ busybox-1.18.1-hush/shell/hush.c 2011-01-07 14:59:19.649956156 +0100
|
|
||||||
@@ -913,7 +913,7 @@ static const struct built_in_command blt
|
|
||||||
*/
|
|
||||||
#if HUSH_DEBUG
|
|
||||||
/* prevent disasters with G.debug_indent < 0 */
|
|
||||||
-# define indent() fprintf(stderr, "%*s", (G.debug_indent * 2) & 0xff, "")
|
|
||||||
+# define indent() fdprintf(2, "%*s", (G.debug_indent * 2) & 0xff, "")
|
|
||||||
# define debug_enter() (G.debug_indent++)
|
|
||||||
# define debug_leave() (G.debug_indent--)
|
|
||||||
#else
|
|
||||||
@@ -923,56 +923,56 @@ static const struct built_in_command blt
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf
|
|
||||||
-# define debug_printf(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_parse
|
|
||||||
-# define debug_printf_parse(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_parse(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_exec
|
|
||||||
-#define debug_printf_exec(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+#define debug_printf_exec(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_env
|
|
||||||
-# define debug_printf_env(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_env(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_jobs
|
|
||||||
-# define debug_printf_jobs(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_jobs(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
# define DEBUG_JOBS 1
|
|
||||||
#else
|
|
||||||
# define DEBUG_JOBS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_expand
|
|
||||||
-# define debug_printf_expand(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_expand(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
# define DEBUG_EXPAND 1
|
|
||||||
#else
|
|
||||||
# define DEBUG_EXPAND 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_varexp
|
|
||||||
-# define debug_printf_varexp(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_varexp(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_glob
|
|
||||||
-# define debug_printf_glob(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_glob(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
# define DEBUG_GLOB 1
|
|
||||||
#else
|
|
||||||
# define DEBUG_GLOB 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_list
|
|
||||||
-# define debug_printf_list(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_list(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_subst
|
|
||||||
-# define debug_printf_subst(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_subst(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef debug_printf_clean
|
|
||||||
-# define debug_printf_clean(...) (indent(), fprintf(stderr, __VA_ARGS__))
|
|
||||||
+# define debug_printf_clean(...) (indent(), fdprintf(2, __VA_ARGS__))
|
|
||||||
# define DEBUG_CLEAN 1
|
|
||||||
#else
|
|
||||||
# define DEBUG_CLEAN 0
|
|
||||||
@@ -982,9 +982,9 @@ static const struct built_in_command blt
|
|
||||||
static void debug_print_strings(const char *prefix, char **vv)
|
|
||||||
{
|
|
||||||
indent();
|
|
||||||
- fprintf(stderr, "%s:\n", prefix);
|
|
||||||
+ fdprintf(2, "%s:\n", prefix);
|
|
||||||
while (*vv)
|
|
||||||
- fprintf(stderr, " '%s'\n", *vv++);
|
|
||||||
+ fdprintf(2, " '%s'\n", *vv++);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
# define debug_print_strings(prefix, vv) ((void)0)
|
|
||||||
@@ -1416,6 +1416,22 @@ static void hush_exit(int exitcode)
|
|
||||||
builtin_eval(argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if ENABLE_FEATURE_CLEAN_UP
|
|
||||||
+ {
|
|
||||||
+ struct variable *cur_var;
|
|
||||||
+ if (G.cwd != bb_msg_unknown)
|
|
||||||
+ free((char*)G.cwd);
|
|
||||||
+ cur_var = G.top_var;
|
|
||||||
+ while (cur_var) {
|
|
||||||
+ struct variable *tmp = cur_var;
|
|
||||||
+ if (!cur_var->max_len)
|
|
||||||
+ free(cur_var->varstr);
|
|
||||||
+ cur_var = cur_var->next;
|
|
||||||
+ free(tmp);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#if ENABLE_HUSH_JOB
|
|
||||||
fflush_all();
|
|
||||||
sigexit(- (exitcode & 0xff));
|
|
||||||
@@ -2158,22 +2174,22 @@ static void debug_print_list(const char
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
indent();
|
|
||||||
- fprintf(stderr, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
|
|
||||||
+ fdprintf(2, "%s: list:%p n:%d string_start:%d length:%d maxlen:%d glob:%d quoted:%d escape:%d\n",
|
|
||||||
prefix, list, n, string_start, o->length, o->maxlen,
|
|
||||||
!!(o->o_expflags & EXP_FLAG_GLOB),
|
|
||||||
o->has_quoted_part,
|
|
||||||
!!(o->o_expflags & EXP_FLAG_ESC_GLOB_CHARS));
|
|
||||||
while (i < n) {
|
|
||||||
indent();
|
|
||||||
- fprintf(stderr, " list[%d]=%d '%s' %p\n", i, (int)list[i],
|
|
||||||
- o->data + (int)list[i] + string_start,
|
|
||||||
- o->data + (int)list[i] + string_start);
|
|
||||||
+ fdprintf(2, " list[%d]=%d '%s' %p\n", i, (int)(uintptr_t)list[i],
|
|
||||||
+ o->data + (int)(uintptr_t)list[i] + string_start,
|
|
||||||
+ o->data + (int)(uintptr_t)list[i] + string_start);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
if (n) {
|
|
||||||
- const char *p = o->data + (int)list[n - 1] + string_start;
|
|
||||||
+ const char *p = o->data + (int)(uintptr_t)list[n - 1] + string_start;
|
|
||||||
indent();
|
|
||||||
- fprintf(stderr, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
|
|
||||||
+ fdprintf(2, " total_sz:%ld\n", (long)((p + strlen(p) + 1) - o->data));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
@@ -2672,18 +2688,18 @@ static void debug_print_tree(struct pipe
|
|
||||||
|
|
||||||
pin = 0;
|
|
||||||
while (pi) {
|
|
||||||
- fprintf(stderr, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
|
|
||||||
+ fdprintf(2, "%*spipe %d res_word=%s followup=%d %s\n", lvl*2, "",
|
|
||||||
pin, RES[pi->res_word], pi->followup, PIPE[pi->followup]);
|
|
||||||
prn = 0;
|
|
||||||
while (prn < pi->num_cmds) {
|
|
||||||
struct command *command = &pi->cmds[prn];
|
|
||||||
char **argv = command->argv;
|
|
||||||
|
|
||||||
- fprintf(stderr, "%*s cmd %d assignment_cnt:%d",
|
|
||||||
+ fdprintf(2, "%*s cmd %d assignment_cnt:%d",
|
|
||||||
lvl*2, "", prn,
|
|
||||||
command->assignment_cnt);
|
|
||||||
if (command->group) {
|
|
||||||
- fprintf(stderr, " group %s: (argv=%p)%s%s\n",
|
|
||||||
+ fdprintf(2, " group %s: (argv=%p)%s%s\n",
|
|
||||||
CMDTYPE[command->cmd_type],
|
|
||||||
argv
|
|
||||||
# if !BB_MMU
|
|
||||||
@@ -2697,10 +2713,10 @@ static void debug_print_tree(struct pipe
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (argv) while (*argv) {
|
|
||||||
- fprintf(stderr, " '%s'", *argv);
|
|
||||||
+ fdprintf(2, " '%s'", *argv);
|
|
||||||
argv++;
|
|
||||||
}
|
|
||||||
- fprintf(stderr, "\n");
|
|
||||||
+ fdprintf(2, "\n");
|
|
||||||
prn++;
|
|
||||||
}
|
|
||||||
pi = pi->next;
|
|
||||||
@@ -4106,7 +4122,16 @@ static struct pipe *parse_stream(char **
|
|
||||||
if (IS_NULL_CMD(ctx.command)
|
|
||||||
&& dest.length == 0 && !dest.has_quoted_part
|
|
||||||
) {
|
|
||||||
- continue;
|
|
||||||
+ /* This newline can be ignored. But...
|
|
||||||
+ * without the below check, interactive shell
|
|
||||||
+ * will ignore even lines with bare <newline>,
|
|
||||||
+ * and show the continuation prompt:
|
|
||||||
+ * ps1_prompt$ <enter>
|
|
||||||
+ * ps2> _ <=== wrong prompt, should be ps1
|
|
||||||
+ */
|
|
||||||
+ struct pipe *pi = ctx.list_head;
|
|
||||||
+ if (pi->num_cmds != 0)
|
|
||||||
+ continue;
|
|
||||||
}
|
|
||||||
/* Treat newline as a command separator. */
|
|
||||||
done_pipe(&ctx, PIPE_SEQ);
|
|
||||||
@@ -7445,7 +7470,7 @@ int hush_main(int argc, char **argv)
|
|
||||||
unsigned builtin_argc;
|
|
||||||
char **e;
|
|
||||||
struct variable *cur_var;
|
|
||||||
- struct variable shell_ver;
|
|
||||||
+ struct variable *shell_ver;
|
|
||||||
|
|
||||||
INIT_G();
|
|
||||||
if (EXIT_SUCCESS) /* if EXIT_SUCCESS == 0, it is already done */
|
|
||||||
@@ -7454,17 +7479,17 @@ int hush_main(int argc, char **argv)
|
|
||||||
G.argv0_for_re_execing = argv[0];
|
|
||||||
#endif
|
|
||||||
/* Deal with HUSH_VERSION */
|
|
||||||
- memset(&shell_ver, 0, sizeof(shell_ver));
|
|
||||||
- shell_ver.flg_export = 1;
|
|
||||||
- shell_ver.flg_read_only = 1;
|
|
||||||
+ shell_ver = xzalloc(sizeof(*shell_ver));
|
|
||||||
+ shell_ver->flg_export = 1;
|
|
||||||
+ shell_ver->flg_read_only = 1;
|
|
||||||
/* Code which handles ${var<op>...} needs writable values for all variables,
|
|
||||||
* therefore we xstrdup: */
|
|
||||||
- shell_ver.varstr = xstrdup(hush_version_str),
|
|
||||||
- G.top_var = &shell_ver;
|
|
||||||
+ shell_ver->varstr = xstrdup(hush_version_str);
|
|
||||||
/* Create shell local variables from the values
|
|
||||||
* currently living in the environment */
|
|
||||||
debug_printf_env("unsetenv '%s'\n", "HUSH_VERSION");
|
|
||||||
unsetenv("HUSH_VERSION"); /* in case it exists in initial env */
|
|
||||||
+ G.top_var = shell_ver;
|
|
||||||
cur_var = G.top_var;
|
|
||||||
e = environ;
|
|
||||||
if (e) while (*e) {
|
|
||||||
@@ -7479,8 +7504,8 @@ int hush_main(int argc, char **argv)
|
|
||||||
e++;
|
|
||||||
}
|
|
||||||
/* (Re)insert HUSH_VERSION into env (AFTER we scanned the env!) */
|
|
||||||
- debug_printf_env("putenv '%s'\n", shell_ver.varstr);
|
|
||||||
- putenv(shell_ver.varstr);
|
|
||||||
+ debug_printf_env("putenv '%s'\n", shell_ver->varstr);
|
|
||||||
+ putenv(shell_ver->varstr);
|
|
||||||
|
|
||||||
/* Export PWD */
|
|
||||||
set_pwd_var(/*exp:*/ 1);
|
|
||||||
@@ -7840,18 +7865,6 @@ int hush_main(int argc, char **argv)
|
|
||||||
parse_and_run_file(stdin);
|
|
||||||
|
|
||||||
final_return:
|
|
||||||
-#if ENABLE_FEATURE_CLEAN_UP
|
|
||||||
- if (G.cwd != bb_msg_unknown)
|
|
||||||
- free((char*)G.cwd);
|
|
||||||
- cur_var = G.top_var->next;
|
|
||||||
- while (cur_var) {
|
|
||||||
- struct variable *tmp = cur_var;
|
|
||||||
- if (!cur_var->max_len)
|
|
||||||
- free(cur_var->varstr);
|
|
||||||
- cur_var = cur_var->next;
|
|
||||||
- free(tmp);
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
hush_exit(G.last_exitcode);
|
|
||||||
}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
diff -urpN busybox-1.18.1/util-linux/mkswap.c busybox-1.18.1-mkswap/util-linux/mkswap.c
|
|
||||||
--- busybox-1.18.1/util-linux/mkswap.c 2010-12-20 01:41:27.000000000 +0100
|
|
||||||
+++ busybox-1.18.1-mkswap/util-linux/mkswap.c 2011-01-05 11:41:24.455856773 +0100
|
|
||||||
@@ -15,7 +15,7 @@ static void mkswap_selinux_setcontext(in
|
|
||||||
if (!is_selinux_enabled())
|
|
||||||
return;
|
|
||||||
|
|
||||||
- xfstat(fd, &stbuf, argv[0]);
|
|
||||||
+ xfstat(fd, &stbuf, path);
|
|
||||||
if (S_ISREG(stbuf.st_mode)) {
|
|
||||||
security_context_t newcon;
|
|
||||||
security_context_t oldcon = NULL;
|
|
@ -1,28 +0,0 @@
|
|||||||
diff -urpN busybox-1.18.1/libbb/procps.c busybox-1.18.1-warning/libbb/procps.c
|
|
||||||
--- busybox-1.18.1/libbb/procps.c 2010-12-21 05:29:45.000000000 +0100
|
|
||||||
+++ busybox-1.18.1-warning/libbb/procps.c 2011-01-07 13:41:22.000000000 +0100
|
|
||||||
@@ -154,6 +154,7 @@ static unsigned long fast_strtoul_10(cha
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
+# if ENABLE_FEATURE_FAST_TOP
|
|
||||||
static long fast_strtol_10(char **endptr)
|
|
||||||
{
|
|
||||||
if (**endptr != '-')
|
|
||||||
@@ -162,6 +163,7 @@ static long fast_strtol_10(char **endptr
|
|
||||||
(*endptr)++;
|
|
||||||
return - (long)fast_strtoul_10(endptr);
|
|
||||||
}
|
|
||||||
+# endif
|
|
||||||
|
|
||||||
static char *skip_fields(char *str, int count)
|
|
||||||
{
|
|
||||||
@@ -448,7 +450,7 @@ procps_status_t* FAST_FUNC procps_scan(p
|
|
||||||
//FIXME: is it safe to assume this field exists?
|
|
||||||
sp->last_seen_on_cpu = fast_strtoul_10(&cp);
|
|
||||||
# endif
|
|
||||||
-#endif /* end of !ENABLE_FEATURE_TOP_SMP_PROCESS */
|
|
||||||
+#endif /* FEATURE_FAST_TOP */
|
|
||||||
|
|
||||||
#if ENABLE_FEATURE_PS_ADDITIONAL_COLUMNS
|
|
||||||
sp->niceness = tasknice;
|
|
@ -1,10 +0,0 @@
|
|||||||
--- busybox-1.18.3/Config.in
|
|
||||||
+++ busybox-1.18.3-buildsys/Config.in
|
|
||||||
@@ -126,7 +126,6 @@ config FEATURE_INSTALLER
|
|
||||||
config INSTALL_NO_USR
|
|
||||||
bool "Don't use /usr"
|
|
||||||
default n
|
|
||||||
- depends on FEATURE_INSTALLER
|
|
||||||
help
|
|
||||||
Disable use of /usr. busybox --install and "make install"
|
|
||||||
will install applets only to /bin and /sbin,
|
|
@ -1,36 +0,0 @@
|
|||||||
--- busybox-1.18.3/modutils/modutils-24.c
|
|
||||||
+++ busybox-1.18.3-modutils24/modutils/modutils-24.c
|
|
||||||
@@ -2474,6 +2474,7 @@ new_process_module_arguments(struct obj_
|
|
||||||
n = 0;
|
|
||||||
p = val;
|
|
||||||
while (*p != 0) {
|
|
||||||
+ char sv_ch;
|
|
||||||
char *endp;
|
|
||||||
|
|
||||||
if (++n > max)
|
|
||||||
@@ -2482,14 +2483,17 @@ new_process_module_arguments(struct obj_
|
|
||||||
switch (*pinfo) {
|
|
||||||
case 's':
|
|
||||||
len = strcspn(p, ",");
|
|
||||||
+ sv_ch = p[len];
|
|
||||||
p[len] = 0;
|
|
||||||
obj_string_patch(f, sym->secidx,
|
|
||||||
loc - contents, p);
|
|
||||||
loc += tgt_sizeof_char_p;
|
|
||||||
p += len;
|
|
||||||
+ *p = sv_ch;
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
len = strcspn(p, ",");
|
|
||||||
+ sv_ch = p[len];
|
|
||||||
p[len] = 0;
|
|
||||||
if (len >= charssize)
|
|
||||||
bb_error_msg_and_die("string too long for %s (max %ld)", param,
|
|
||||||
@@ -2497,6 +2501,7 @@ new_process_module_arguments(struct obj_
|
|
||||||
strcpy((char *) loc, p);
|
|
||||||
loc += charssize;
|
|
||||||
p += len;
|
|
||||||
+ *p = sv_ch;
|
|
||||||
break;
|
|
||||||
case 'b':
|
|
||||||
*loc++ = strtoul(p, &endp, 0);
|
|
@ -1,128 +0,0 @@
|
|||||||
--- busybox-1.18.3/networking/wget.c
|
|
||||||
+++ busybox-1.18.3-wget/networking/wget.c
|
|
||||||
@@ -446,7 +446,7 @@ static FILE* prepare_ftp_session(FILE **
|
|
||||||
|
|
||||||
static void NOINLINE retrieve_file_data(FILE *dfp, int output_fd)
|
|
||||||
{
|
|
||||||
- char buf[512];
|
|
||||||
+ char buf[4*1024]; /* made bigger to speed up local xfers */
|
|
||||||
#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
|
|
||||||
# if ENABLE_FEATURE_WGET_TIMEOUT
|
|
||||||
unsigned second_cnt;
|
|
||||||
@@ -455,7 +455,6 @@ static void NOINLINE retrieve_file_data(
|
|
||||||
|
|
||||||
polldata.fd = fileno(dfp);
|
|
||||||
polldata.events = POLLIN | POLLPRI;
|
|
||||||
- ndelay_on(polldata.fd);
|
|
||||||
#endif
|
|
||||||
progress_meter(PROGRESS_START);
|
|
||||||
|
|
||||||
@@ -464,6 +463,10 @@ static void NOINLINE retrieve_file_data(
|
|
||||||
|
|
||||||
/* Loops only if chunked */
|
|
||||||
while (1) {
|
|
||||||
+
|
|
||||||
+#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
|
|
||||||
+ ndelay_on(polldata.fd);
|
|
||||||
+#endif
|
|
||||||
while (1) {
|
|
||||||
int n;
|
|
||||||
unsigned rdsz;
|
|
||||||
@@ -493,22 +496,46 @@ static void NOINLINE retrieve_file_data(
|
|
||||||
progress_meter(PROGRESS_BUMP);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
+ /* fread internally uses read loop, which in our case
|
|
||||||
+ * is usually exited when we get EAGAIN.
|
|
||||||
+ * In this case, libc sets error marker on the stream.
|
|
||||||
+ * Need to clear it before next fread to avoid possible
|
|
||||||
+ * rare false positive ferror below. Rare because usually
|
|
||||||
+ * fread gets more than zero bytes, and we don't fall
|
|
||||||
+ * into if (n <= 0) ...
|
|
||||||
+ */
|
|
||||||
+ clearerr(dfp);
|
|
||||||
+ errno = 0;
|
|
||||||
n = safe_fread(buf, rdsz, dfp);
|
|
||||||
+ /* man fread:
|
|
||||||
+ * If error occurs, or EOF is reached, the return value
|
|
||||||
+ * is a short item count (or zero).
|
|
||||||
+ * fread does not distinguish between EOF and error.
|
|
||||||
+ */
|
|
||||||
if (n <= 0) {
|
|
||||||
- if (ferror(dfp)) {
|
|
||||||
- /* perror will not work: ferror doesn't set errno */
|
|
||||||
- bb_error_msg_and_die(bb_msg_read_error);
|
|
||||||
- }
|
|
||||||
- break;
|
|
||||||
+#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
|
|
||||||
+ if (errno == EAGAIN) /* poll lied, there is no data? */
|
|
||||||
+ continue; /* yes */
|
|
||||||
+#endif
|
|
||||||
+ if (ferror(dfp))
|
|
||||||
+ bb_perror_msg_and_die(bb_msg_read_error);
|
|
||||||
+ break; /* EOF, not error */
|
|
||||||
}
|
|
||||||
+
|
|
||||||
xwrite(output_fd, buf, n);
|
|
||||||
#if ENABLE_FEATURE_WGET_STATUSBAR
|
|
||||||
G.transferred += n;
|
|
||||||
progress_meter(PROGRESS_BUMP);
|
|
||||||
#endif
|
|
||||||
- if (G.got_clen)
|
|
||||||
+ if (G.got_clen) {
|
|
||||||
G.content_len -= n;
|
|
||||||
+ if (G.content_len == 0)
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
+#if ENABLE_FEATURE_WGET_STATUSBAR || ENABLE_FEATURE_WGET_TIMEOUT
|
|
||||||
+ ndelay_off(polldata.fd);
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
if (!G.chunked)
|
|
||||||
break;
|
|
||||||
@@ -706,6 +733,11 @@ int wget_main(int argc UNUSED_PARAM, cha
|
|
||||||
fprintf(sfp, "Host: %s\r\nUser-Agent: %s\r\n",
|
|
||||||
target.host, user_agent);
|
|
||||||
|
|
||||||
+ /* Ask server to close the connection as soon as we are done
|
|
||||||
+ * (IOW: we do not intend to send more requests)
|
|
||||||
+ */
|
|
||||||
+ fprintf(sfp, "Connection: close\r\n");
|
|
||||||
+
|
|
||||||
#if ENABLE_FEATURE_WGET_AUTHENTICATION
|
|
||||||
if (target.user) {
|
|
||||||
fprintf(sfp, "Proxy-Authorization: Basic %s\r\n"+6,
|
|
||||||
@@ -719,22 +751,25 @@ int wget_main(int argc UNUSED_PARAM, cha
|
|
||||||
|
|
||||||
if (G.beg_range)
|
|
||||||
fprintf(sfp, "Range: bytes=%"OFF_FMT"u-\r\n", G.beg_range);
|
|
||||||
+
|
|
||||||
#if ENABLE_FEATURE_WGET_LONG_OPTIONS
|
|
||||||
if (extra_headers)
|
|
||||||
fputs(extra_headers, sfp);
|
|
||||||
|
|
||||||
if (opt & WGET_OPT_POST_DATA) {
|
|
||||||
char *estr = URL_escape(post_data);
|
|
||||||
- fprintf(sfp, "Content-Type: application/x-www-form-urlencoded\r\n");
|
|
||||||
- fprintf(sfp, "Content-Length: %u\r\n" "\r\n" "%s",
|
|
||||||
- (int) strlen(estr), estr);
|
|
||||||
- /*fprintf(sfp, "Connection: Keep-Alive\r\n\r\n");*/
|
|
||||||
- /*fprintf(sfp, "%s\r\n", estr);*/
|
|
||||||
+ fprintf(sfp,
|
|
||||||
+ "Content-Type: application/x-www-form-urlencoded\r\n"
|
|
||||||
+ "Content-Length: %u\r\n"
|
|
||||||
+ "\r\n"
|
|
||||||
+ "%s",
|
|
||||||
+ (int) strlen(estr), estr
|
|
||||||
+ );
|
|
||||||
free(estr);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
- { /* If "Connection:" is needed, document why */
|
|
||||||
- fprintf(sfp, /* "Connection: close\r\n" */ "\r\n");
|
|
||||||
+ {
|
|
||||||
+ fprintf(sfp, "\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(sfp);
|
|
@ -1,11 +0,0 @@
|
|||||||
--- busybox-1.18.4/procps/fuser.c
|
|
||||||
+++ busybox-1.18.4-fuser/procps/fuser.c
|
|
||||||
@@ -271,7 +271,7 @@ Find processes which use FILEs or PORTs
|
|
||||||
if (sscanf(*pp, "%u/%4s", &port, tproto) != 2)
|
|
||||||
goto file;
|
|
||||||
sprintf(path, "/proc/net/%s", tproto);
|
|
||||||
- if (access(path, R_OK) != 0) { /* PORT/PROTO */
|
|
||||||
+ if (access(path, R_OK) == 0) { /* PORT/PROTO */
|
|
||||||
scan_proc_net(path, port);
|
|
||||||
} else { /* FILE */
|
|
||||||
file:
|
|
@ -1,183 +0,0 @@
|
|||||||
--- busybox-1.18.4/shell/hush.c
|
|
||||||
+++ busybox-1.18.4-hush/shell/hush.c
|
|
||||||
@@ -427,6 +427,15 @@ enum {
|
|
||||||
/* Used for initialization: o_string foo = NULL_O_STRING; */
|
|
||||||
#define NULL_O_STRING { NULL }
|
|
||||||
|
|
||||||
+#ifndef debug_printf_parse
|
|
||||||
+static const char *const assignment_flag[] = {
|
|
||||||
+ "MAYBE_ASSIGNMENT",
|
|
||||||
+ "DEFINITELY_ASSIGNMENT",
|
|
||||||
+ "NOT_ASSIGNMENT",
|
|
||||||
+ "WORD_IS_KEYWORD",
|
|
||||||
+};
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/* I can almost use ordinary FILE*. Is open_memstream() universally
|
|
||||||
* available? Where is it documented? */
|
|
||||||
typedef struct in_str {
|
|
||||||
@@ -2885,24 +2894,24 @@ static const struct reserved_combo* matc
|
|
||||||
*/
|
|
||||||
static const struct reserved_combo reserved_list[] = {
|
|
||||||
# if ENABLE_HUSH_IF
|
|
||||||
- { "!", RES_NONE, NOT_ASSIGNMENT , 0 },
|
|
||||||
- { "if", RES_IF, WORD_IS_KEYWORD, FLAG_THEN | FLAG_START },
|
|
||||||
- { "then", RES_THEN, WORD_IS_KEYWORD, FLAG_ELIF | FLAG_ELSE | FLAG_FI },
|
|
||||||
- { "elif", RES_ELIF, WORD_IS_KEYWORD, FLAG_THEN },
|
|
||||||
- { "else", RES_ELSE, WORD_IS_KEYWORD, FLAG_FI },
|
|
||||||
- { "fi", RES_FI, NOT_ASSIGNMENT , FLAG_END },
|
|
||||||
+ { "!", RES_NONE, NOT_ASSIGNMENT , 0 },
|
|
||||||
+ { "if", RES_IF, MAYBE_ASSIGNMENT, FLAG_THEN | FLAG_START },
|
|
||||||
+ { "then", RES_THEN, MAYBE_ASSIGNMENT, FLAG_ELIF | FLAG_ELSE | FLAG_FI },
|
|
||||||
+ { "elif", RES_ELIF, MAYBE_ASSIGNMENT, FLAG_THEN },
|
|
||||||
+ { "else", RES_ELSE, MAYBE_ASSIGNMENT, FLAG_FI },
|
|
||||||
+ { "fi", RES_FI, NOT_ASSIGNMENT , FLAG_END },
|
|
||||||
# endif
|
|
||||||
# if ENABLE_HUSH_LOOPS
|
|
||||||
- { "for", RES_FOR, NOT_ASSIGNMENT , FLAG_IN | FLAG_DO | FLAG_START },
|
|
||||||
- { "while", RES_WHILE, WORD_IS_KEYWORD, FLAG_DO | FLAG_START },
|
|
||||||
- { "until", RES_UNTIL, WORD_IS_KEYWORD, FLAG_DO | FLAG_START },
|
|
||||||
- { "in", RES_IN, NOT_ASSIGNMENT , FLAG_DO },
|
|
||||||
- { "do", RES_DO, WORD_IS_KEYWORD, FLAG_DONE },
|
|
||||||
- { "done", RES_DONE, NOT_ASSIGNMENT , FLAG_END },
|
|
||||||
+ { "for", RES_FOR, NOT_ASSIGNMENT , FLAG_IN | FLAG_DO | FLAG_START },
|
|
||||||
+ { "while", RES_WHILE, MAYBE_ASSIGNMENT, FLAG_DO | FLAG_START },
|
|
||||||
+ { "until", RES_UNTIL, MAYBE_ASSIGNMENT, FLAG_DO | FLAG_START },
|
|
||||||
+ { "in", RES_IN, NOT_ASSIGNMENT , FLAG_DO },
|
|
||||||
+ { "do", RES_DO, MAYBE_ASSIGNMENT, FLAG_DONE },
|
|
||||||
+ { "done", RES_DONE, NOT_ASSIGNMENT , FLAG_END },
|
|
||||||
# endif
|
|
||||||
# if ENABLE_HUSH_CASE
|
|
||||||
- { "case", RES_CASE, NOT_ASSIGNMENT , FLAG_MATCH | FLAG_START },
|
|
||||||
- { "esac", RES_ESAC, NOT_ASSIGNMENT , FLAG_END },
|
|
||||||
+ { "case", RES_CASE, NOT_ASSIGNMENT , FLAG_MATCH | FLAG_START },
|
|
||||||
+ { "esac", RES_ESAC, NOT_ASSIGNMENT , FLAG_END },
|
|
||||||
# endif
|
|
||||||
};
|
|
||||||
const struct reserved_combo *r;
|
|
||||||
@@ -2968,6 +2977,7 @@ static int reserved_word(o_string *word,
|
|
||||||
ctx->ctx_res_w = r->res;
|
|
||||||
ctx->old_flag = r->flag;
|
|
||||||
word->o_assignment = r->assignment_flag;
|
|
||||||
+ debug_printf_parse("word->o_assignment='%s'\n", assignment_flag[word->o_assignment]);
|
|
||||||
|
|
||||||
if (ctx->old_flag & FLAG_END) {
|
|
||||||
struct parse_context *old;
|
|
||||||
@@ -3034,18 +3044,6 @@ static int done_word(o_string *word, str
|
|
||||||
debug_printf_parse("word stored in rd_filename: '%s'\n", word->data);
|
|
||||||
ctx->pending_redirect = NULL;
|
|
||||||
} else {
|
|
||||||
- /* If this word wasn't an assignment, next ones definitely
|
|
||||||
- * can't be assignments. Even if they look like ones. */
|
|
||||||
- if (word->o_assignment != DEFINITELY_ASSIGNMENT
|
|
||||||
- && word->o_assignment != WORD_IS_KEYWORD
|
|
||||||
- ) {
|
|
||||||
- word->o_assignment = NOT_ASSIGNMENT;
|
|
||||||
- } else {
|
|
||||||
- if (word->o_assignment == DEFINITELY_ASSIGNMENT)
|
|
||||||
- command->assignment_cnt++;
|
|
||||||
- word->o_assignment = MAYBE_ASSIGNMENT;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
#if HAS_KEYWORDS
|
|
||||||
# if ENABLE_HUSH_CASE
|
|
||||||
if (ctx->ctx_dsemicolon
|
|
||||||
@@ -3065,8 +3063,9 @@ static int done_word(o_string *word, str
|
|
||||||
&& ctx->ctx_res_w != RES_CASE
|
|
||||||
# endif
|
|
||||||
) {
|
|
||||||
- debug_printf_parse("checking '%s' for reserved-ness\n", word->data);
|
|
||||||
- if (reserved_word(word, ctx)) {
|
|
||||||
+ int reserved = reserved_word(word, ctx);
|
|
||||||
+ debug_printf_parse("checking for reserved-ness: %d\n", reserved);
|
|
||||||
+ if (reserved) {
|
|
||||||
o_reset_to_empty_unquoted(word);
|
|
||||||
debug_printf_parse("done_word return %d\n",
|
|
||||||
(ctx->ctx_res_w == RES_SNTX));
|
|
||||||
@@ -3087,6 +3086,23 @@ static int done_word(o_string *word, str
|
|
||||||
"groups and arglists don't mix\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ /* If this word wasn't an assignment, next ones definitely
|
|
||||||
+ * can't be assignments. Even if they look like ones. */
|
|
||||||
+ if (word->o_assignment != DEFINITELY_ASSIGNMENT
|
|
||||||
+ && word->o_assignment != WORD_IS_KEYWORD
|
|
||||||
+ ) {
|
|
||||||
+ word->o_assignment = NOT_ASSIGNMENT;
|
|
||||||
+ } else {
|
|
||||||
+ if (word->o_assignment == DEFINITELY_ASSIGNMENT) {
|
|
||||||
+ command->assignment_cnt++;
|
|
||||||
+ debug_printf_parse("++assignment_cnt=%d\n", command->assignment_cnt);
|
|
||||||
+ }
|
|
||||||
+ debug_printf_parse("word->o_assignment was:'%s'\n", assignment_flag[word->o_assignment]);
|
|
||||||
+ word->o_assignment = MAYBE_ASSIGNMENT;
|
|
||||||
+ }
|
|
||||||
+ debug_printf_parse("word->o_assignment='%s'\n", assignment_flag[word->o_assignment]);
|
|
||||||
+
|
|
||||||
if (word->has_quoted_part
|
|
||||||
/* optimization: and if it's ("" or '') or ($v... or `cmd`...): */
|
|
||||||
&& (word->data[0] == '\0' || word->data[0] == SPECIAL_VAR_SYMBOL)
|
|
||||||
@@ -4105,6 +4121,7 @@ static struct pipe *parse_stream(char **
|
|
||||||
&& is_well_formed_var_name(dest.data, '=')
|
|
||||||
) {
|
|
||||||
dest.o_assignment = DEFINITELY_ASSIGNMENT;
|
|
||||||
+ debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
@@ -4154,6 +4171,7 @@ static struct pipe *parse_stream(char **
|
|
||||||
heredoc_cnt = 0;
|
|
||||||
}
|
|
||||||
dest.o_assignment = MAYBE_ASSIGNMENT;
|
|
||||||
+ debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
|
|
||||||
ch = ';';
|
|
||||||
/* note: if (is_blank) continue;
|
|
||||||
* will still trigger for us */
|
|
||||||
@@ -4203,6 +4221,7 @@ static struct pipe *parse_stream(char **
|
|
||||||
}
|
|
||||||
done_pipe(&ctx, PIPE_SEQ);
|
|
||||||
dest.o_assignment = MAYBE_ASSIGNMENT;
|
|
||||||
+ debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
|
|
||||||
/* Do we sit outside of any if's, loops or case's? */
|
|
||||||
if (!HAS_KEYWORDS
|
|
||||||
IF_HAS_KEYWORDS(|| (ctx.ctx_res_w == RES_NONE && ctx.old_flag == 0))
|
|
||||||
@@ -4309,6 +4328,7 @@ static struct pipe *parse_stream(char **
|
|
||||||
/* ch is a special char and thus this word
|
|
||||||
* cannot be an assignment */
|
|
||||||
dest.o_assignment = NOT_ASSIGNMENT;
|
|
||||||
+ debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: nommu_addchr(&ctx.as_string, ch) is already done */
|
|
||||||
@@ -4406,6 +4426,7 @@ static struct pipe *parse_stream(char **
|
|
||||||
/* We just finished a cmd. New one may start
|
|
||||||
* with an assignment */
|
|
||||||
dest.o_assignment = MAYBE_ASSIGNMENT;
|
|
||||||
+ debug_printf_parse("dest.o_assignment='%s'\n", assignment_flag[dest.o_assignment]);
|
|
||||||
break;
|
|
||||||
case '&':
|
|
||||||
if (done_word(&dest, &ctx)) {
|
|
||||||
@@ -7292,7 +7313,10 @@ static int run_list(struct pipe *pi)
|
|
||||||
#endif
|
|
||||||
#if ENABLE_HUSH_LOOPS
|
|
||||||
/* Beware of "while false; true; do ..."! */
|
|
||||||
- if (pi->next && pi->next->res_word == RES_DO) {
|
|
||||||
+ if (pi->next
|
|
||||||
+ && (pi->next->res_word == RES_DO || pi->next->res_word == RES_DONE)
|
|
||||||
+ /* (the second check above is needed for "while ...; do \n done" case) */
|
|
||||||
+ ) {
|
|
||||||
if (rword == RES_WHILE) {
|
|
||||||
if (rcode) {
|
|
||||||
/* "while false; do...done" - exitcode 0 */
|
|
||||||
--- busybox-1.18.4/shell/hush_test/hush-misc/while3.right
|
|
||||||
+++ busybox-1.18.4-hush/shell/hush_test/hush-misc/while3.right
|
|
||||||
@@ -0,0 +1 @@
|
|
||||||
+OK:0
|
|
||||||
--- busybox-1.18.4/shell/hush_test/hush-misc/while3.tests
|
|
||||||
+++ busybox-1.18.4-hush/shell/hush_test/hush-misc/while3.tests
|
|
||||||
@@ -0,0 +1,4 @@
|
|
||||||
+while false; do
|
|
||||||
+ # bash will require at least ":" here...
|
|
||||||
+done
|
|
||||||
+echo OK:$?
|
|
@ -1,11 +1,11 @@
|
|||||||
--- a/shell/ash.c
|
--- a/shell/ash.c
|
||||||
+++ b/shell/ash.c
|
+++ b/shell/ash.c
|
||||||
@@ -75,6 +75,8 @@
|
@@ -75,6 +75,8 @@
|
||||||
//applet:IF_ASH(APPLET(ash, _BB_DIR_BIN, _BB_SUID_DROP))
|
//applet:IF_ASH(APPLET(ash, BB_DIR_BIN, BB_SUID_DROP))
|
||||||
//applet:IF_FEATURE_SH_IS_ASH(APPLET_ODDNAME(sh, ash, _BB_DIR_BIN, _BB_SUID_DROP, sh))
|
//applet:IF_FEATURE_SH_IS_ASH(APPLET_ODDNAME(sh, ash, BB_DIR_BIN, BB_SUID_DROP, sh))
|
||||||
//applet:IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, _BB_DIR_BIN, _BB_SUID_DROP, bash))
|
//applet:IF_FEATURE_BASH_IS_ASH(APPLET_ODDNAME(bash, ash, BB_DIR_BIN, BB_SUID_DROP, bash))
|
||||||
+//applet:IF_ASH(APPLET_ODDNAME(bb, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
|
+//applet:IF_ASH(APPLET_ODDNAME(bb, ash, BB_DIR_BIN, BB_SUID_DROP, ash))
|
||||||
+//applet:IF_ASH(APPLET_ODDNAME(bbsh, ash, _BB_DIR_BIN, _BB_SUID_DROP, ash))
|
+//applet:IF_ASH(APPLET_ODDNAME(bbsh, ash, BB_DIR_BIN, BB_SUID_DROP, ash))
|
||||||
|
|
||||||
//kbuild:lib-$(CONFIG_ASH) += ash.o ash_ptr_hack.o shell_common.o
|
//kbuild:lib-$(CONFIG_ASH) += ash.o ash_ptr_hack.o shell_common.o
|
||||||
//kbuild:lib-$(CONFIG_ASH_RANDOM_SUPPORT) += random.o
|
//kbuild:lib-$(CONFIG_ASH_RANDOM_SUPPORT) += random.o
|
@ -0,0 +1,18 @@
|
|||||||
|
--- busybox-1.19.0/shell/cttyhack.c
|
||||||
|
+++ busybox-1.19.0-cttyhack/shell/cttyhack.c
|
||||||
|
@@ -122,10 +122,12 @@ int cttyhack_main(int argc UNUSED_PARAM,
|
||||||
|
do {
|
||||||
|
#ifdef __linux__
|
||||||
|
int s = open_read_close("/sys/class/tty/console/active",
|
||||||
|
- console + 5, sizeof(console) - 5 - 1);
|
||||||
|
+ console + 5, sizeof(console) - 5);
|
||||||
|
if (s > 0) {
|
||||||
|
- /* found active console via sysfs (Linux 2.6.38+) */
|
||||||
|
- console[5 + s] = '\0';
|
||||||
|
+ /* found active console via sysfs (Linux 2.6.38+)
|
||||||
|
+ * sysfs string looks like "ttyS0\n" so zap the newline:
|
||||||
|
+ */
|
||||||
|
+ console[4 + s] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
12
sdk_container/src/third_party/portage-stable/sys-apps/busybox/files/busybox-1.19.0-less.patch
vendored
Normal file
12
sdk_container/src/third_party/portage-stable/sys-apps/busybox/files/busybox-1.19.0-less.patch
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
--- busybox-1.19.0/miscutils/less.c
|
||||||
|
+++ busybox-1.19.0-less/miscutils/less.c
|
||||||
|
@@ -990,7 +990,8 @@ static int64_t less_getch(int pos)
|
||||||
|
*/
|
||||||
|
if (key >= 0 && key < ' ' && key != 0x0d && key != 8)
|
||||||
|
goto again;
|
||||||
|
- return key;
|
||||||
|
+
|
||||||
|
+ return key64;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char* less_gets(int sz)
|
237
sdk_container/src/third_party/portage-stable/sys-apps/busybox/files/busybox-1.19.0-sed.patch
vendored
Normal file
237
sdk_container/src/third_party/portage-stable/sys-apps/busybox/files/busybox-1.19.0-sed.patch
vendored
Normal file
@ -0,0 +1,237 @@
|
|||||||
|
--- busybox-1.19.0/editors/sed.c
|
||||||
|
+++ busybox-1.19.0-sed/editors/sed.c
|
||||||
|
@@ -75,6 +75,13 @@
|
||||||
|
#include "libbb.h"
|
||||||
|
#include "xregex.h"
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
+# define dbg(...) bb_error_msg(__VA_ARGS__)
|
||||||
|
+#else
|
||||||
|
+# define dbg(...) ((void)0)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+
|
||||||
|
enum {
|
||||||
|
OPT_in_place = 1 << 0,
|
||||||
|
};
|
||||||
|
@@ -89,6 +96,7 @@ typedef struct sed_cmd_s {
|
||||||
|
regex_t *end_match; /* sed -e '/match/,/end_match/cmd' */
|
||||||
|
regex_t *sub_match; /* For 's/sub_match/string/' */
|
||||||
|
int beg_line; /* 'sed 1p' 0 == apply commands to all lines */
|
||||||
|
+ int beg_line_orig; /* copy of the above, needed for -i */
|
||||||
|
int end_line; /* 'sed 1,3p' 0 == one line only. -1 = last line ($) */
|
||||||
|
|
||||||
|
FILE *sw_file; /* File (sw) command writes to, -1 for none. */
|
||||||
|
@@ -123,7 +131,7 @@ struct globals {
|
||||||
|
regex_t *previous_regex_ptr;
|
||||||
|
|
||||||
|
/* linked list of sed commands */
|
||||||
|
- sed_cmd_t sed_cmd_head, *sed_cmd_tail;
|
||||||
|
+ sed_cmd_t *sed_cmd_head, **sed_cmd_tail;
|
||||||
|
|
||||||
|
/* Linked list of append lines */
|
||||||
|
llist_t *append_head;
|
||||||
|
@@ -148,7 +156,7 @@ struct BUG_G_too_big {
|
||||||
|
#if ENABLE_FEATURE_CLEAN_UP
|
||||||
|
static void sed_free_and_close_stuff(void)
|
||||||
|
{
|
||||||
|
- sed_cmd_t *sed_cmd = G.sed_cmd_head.next;
|
||||||
|
+ sed_cmd_t *sed_cmd = G.sed_cmd_head;
|
||||||
|
|
||||||
|
llist_free(G.append_head, free);
|
||||||
|
|
||||||
|
@@ -599,6 +607,7 @@ static void add_cmd(const char *cmdstr)
|
||||||
|
|
||||||
|
/* first part (if present) is an address: either a '$', a number or a /regex/ */
|
||||||
|
cmdstr += get_address(cmdstr, &sed_cmd->beg_line, &sed_cmd->beg_match);
|
||||||
|
+ sed_cmd->beg_line_orig = sed_cmd->beg_line;
|
||||||
|
|
||||||
|
/* second part (if present) will begin with a comma */
|
||||||
|
if (*cmdstr == ',') {
|
||||||
|
@@ -630,8 +639,8 @@ static void add_cmd(const char *cmdstr)
|
||||||
|
cmdstr = parse_cmd_args(sed_cmd, cmdstr);
|
||||||
|
|
||||||
|
/* Add the command to the command array */
|
||||||
|
- G.sed_cmd_tail->next = sed_cmd;
|
||||||
|
- G.sed_cmd_tail = G.sed_cmd_tail->next;
|
||||||
|
+ *G.sed_cmd_tail = sed_cmd;
|
||||||
|
+ G.sed_cmd_tail = &sed_cmd->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we glued multiple lines together, free the memory. */
|
||||||
|
@@ -777,7 +786,7 @@ static sed_cmd_t *branch_to(char *label)
|
||||||
|
{
|
||||||
|
sed_cmd_t *sed_cmd;
|
||||||
|
|
||||||
|
- for (sed_cmd = G.sed_cmd_head.next; sed_cmd; sed_cmd = sed_cmd->next) {
|
||||||
|
+ for (sed_cmd = G.sed_cmd_head; sed_cmd; sed_cmd = sed_cmd->next) {
|
||||||
|
if (sed_cmd->cmd == ':' && sed_cmd->string && !strcmp(sed_cmd->string, label)) {
|
||||||
|
return sed_cmd;
|
||||||
|
}
|
||||||
|
@@ -953,24 +962,24 @@ static void process_files(void)
|
||||||
|
|
||||||
|
/* For every line, go through all the commands */
|
||||||
|
restart:
|
||||||
|
- for (sed_cmd = G.sed_cmd_head.next; sed_cmd; sed_cmd = sed_cmd->next) {
|
||||||
|
+ for (sed_cmd = G.sed_cmd_head; sed_cmd; sed_cmd = sed_cmd->next) {
|
||||||
|
int old_matched, matched;
|
||||||
|
|
||||||
|
old_matched = sed_cmd->in_match;
|
||||||
|
|
||||||
|
/* Determine if this command matches this line: */
|
||||||
|
|
||||||
|
- //bb_error_msg("match1:%d", sed_cmd->in_match);
|
||||||
|
- //bb_error_msg("match2:%d", (!sed_cmd->beg_line && !sed_cmd->end_line
|
||||||
|
- // && !sed_cmd->beg_match && !sed_cmd->end_match));
|
||||||
|
- //bb_error_msg("match3:%d", (sed_cmd->beg_line > 0
|
||||||
|
- // && (sed_cmd->end_line || sed_cmd->end_match
|
||||||
|
- // ? (sed_cmd->beg_line <= linenum)
|
||||||
|
- // : (sed_cmd->beg_line == linenum)
|
||||||
|
- // )
|
||||||
|
- // )
|
||||||
|
- //bb_error_msg("match4:%d", (beg_match(sed_cmd, pattern_space)));
|
||||||
|
- //bb_error_msg("match5:%d", (sed_cmd->beg_line == -1 && next_line == NULL));
|
||||||
|
+ dbg("match1:%d", sed_cmd->in_match);
|
||||||
|
+ dbg("match2:%d", (!sed_cmd->beg_line && !sed_cmd->end_line
|
||||||
|
+ && !sed_cmd->beg_match && !sed_cmd->end_match));
|
||||||
|
+ dbg("match3:%d", (sed_cmd->beg_line > 0
|
||||||
|
+ && (sed_cmd->end_line || sed_cmd->end_match
|
||||||
|
+ ? (sed_cmd->beg_line <= linenum)
|
||||||
|
+ : (sed_cmd->beg_line == linenum)
|
||||||
|
+ )
|
||||||
|
+ ));
|
||||||
|
+ dbg("match4:%d", (beg_match(sed_cmd, pattern_space)));
|
||||||
|
+ dbg("match5:%d", (sed_cmd->beg_line == -1 && next_line == NULL));
|
||||||
|
|
||||||
|
/* Are we continuing a previous multi-line match? */
|
||||||
|
sed_cmd->in_match = sed_cmd->in_match
|
||||||
|
@@ -981,7 +990,14 @@ static void process_files(void)
|
||||||
|
|| (sed_cmd->beg_line > 0
|
||||||
|
&& (sed_cmd->end_line || sed_cmd->end_match
|
||||||
|
/* note: even if end is numeric and is < linenum too,
|
||||||
|
- * GNU sed matches! We match too */
|
||||||
|
+ * GNU sed matches! We match too, therefore we don't
|
||||||
|
+ * check here that linenum <= end.
|
||||||
|
+ * Example:
|
||||||
|
+ * printf '1\n2\n3\n4\n' | sed -n '1{N;N;d};1p;2,3p;3p;4p'
|
||||||
|
+ * first three input lines are deleted;
|
||||||
|
+ * 4th line is matched and printed
|
||||||
|
+ * by "2,3" (!) and by "4" ranges
|
||||||
|
+ */
|
||||||
|
? (sed_cmd->beg_line <= linenum) /* N,end */
|
||||||
|
: (sed_cmd->beg_line == linenum) /* N */
|
||||||
|
)
|
||||||
|
@@ -994,16 +1010,14 @@ static void process_files(void)
|
||||||
|
/* Snapshot the value */
|
||||||
|
matched = sed_cmd->in_match;
|
||||||
|
|
||||||
|
- //bb_error_msg("cmd:'%c' matched:%d beg_line:%d end_line:%d linenum:%d",
|
||||||
|
- //sed_cmd->cmd, matched, sed_cmd->beg_line, sed_cmd->end_line, linenum);
|
||||||
|
+ dbg("cmd:'%c' matched:%d beg_line:%d end_line:%d linenum:%d",
|
||||||
|
+ sed_cmd->cmd, matched, sed_cmd->beg_line, sed_cmd->end_line, linenum);
|
||||||
|
|
||||||
|
/* Is this line the end of the current match? */
|
||||||
|
|
||||||
|
if (matched) {
|
||||||
|
/* once matched, "n,xxx" range is dead, disabling it */
|
||||||
|
- if (sed_cmd->beg_line > 0
|
||||||
|
- && !(option_mask32 & OPT_in_place) /* but not for -i */
|
||||||
|
- ) {
|
||||||
|
+ if (sed_cmd->beg_line > 0) {
|
||||||
|
sed_cmd->beg_line = -2;
|
||||||
|
}
|
||||||
|
sed_cmd->in_match = !(
|
||||||
|
@@ -1017,7 +1031,8 @@ static void process_files(void)
|
||||||
|
/* or does this line matches our last address regex */
|
||||||
|
|| (sed_cmd->end_match && old_matched
|
||||||
|
&& (regexec(sed_cmd->end_match,
|
||||||
|
- pattern_space, 0, NULL, 0) == 0))
|
||||||
|
+ pattern_space, 0, NULL, 0) == 0)
|
||||||
|
+ )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1407,11 +1422,12 @@ int sed_main(int argc UNUSED_PARAM, char
|
||||||
|
add_input_file(stdin);
|
||||||
|
} else {
|
||||||
|
int i;
|
||||||
|
- FILE *file;
|
||||||
|
|
||||||
|
for (i = 0; argv[i]; i++) {
|
||||||
|
struct stat statbuf;
|
||||||
|
int nonstdoutfd;
|
||||||
|
+ FILE *file;
|
||||||
|
+ sed_cmd_t *sed_cmd;
|
||||||
|
|
||||||
|
if (LONE_DASH(argv[i]) && !(opt & OPT_in_place)) {
|
||||||
|
add_input_file(stdin);
|
||||||
|
@@ -1423,11 +1439,13 @@ int sed_main(int argc UNUSED_PARAM, char
|
||||||
|
status = EXIT_FAILURE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
+ add_input_file(file);
|
||||||
|
if (!(opt & OPT_in_place)) {
|
||||||
|
- add_input_file(file);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* -i: process each FILE separately: */
|
||||||
|
+
|
||||||
|
G.outname = xasprintf("%sXXXXXX", argv[i]);
|
||||||
|
nonstdoutfd = xmkstemp(G.outname);
|
||||||
|
G.nonstdout = xfdopen_for_write(nonstdoutfd);
|
||||||
|
@@ -1438,15 +1456,20 @@ int sed_main(int argc UNUSED_PARAM, char
|
||||||
|
* but GNU sed 4.2.1 does not preserve them either */
|
||||||
|
fchmod(nonstdoutfd, statbuf.st_mode);
|
||||||
|
fchown(nonstdoutfd, statbuf.st_uid, statbuf.st_gid);
|
||||||
|
- add_input_file(file);
|
||||||
|
+
|
||||||
|
process_files();
|
||||||
|
fclose(G.nonstdout);
|
||||||
|
-
|
||||||
|
G.nonstdout = stdout;
|
||||||
|
+
|
||||||
|
/* unlink(argv[i]); */
|
||||||
|
xrename(G.outname, argv[i]);
|
||||||
|
free(G.outname);
|
||||||
|
G.outname = NULL;
|
||||||
|
+
|
||||||
|
+ /* Re-enable disabled range matches */
|
||||||
|
+ for (sed_cmd = G.sed_cmd_head; sed_cmd; sed_cmd = sed_cmd->next) {
|
||||||
|
+ sed_cmd->beg_line = sed_cmd->beg_line_orig;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
/* Here, to handle "sed 'cmds' nonexistent_file" case we did:
|
||||||
|
* if (G.current_input_file >= G.input_file_count)
|
||||||
|
--- busybox-1.19.0/testsuite/sed.tests
|
||||||
|
+++ busybox-1.19.0-sed/testsuite/sed.tests
|
||||||
|
@@ -6,7 +6,7 @@
|
||||||
|
|
||||||
|
. ./testing.sh
|
||||||
|
|
||||||
|
-# testing "description" "arguments" "result" "infile" "stdin"
|
||||||
|
+# testing "description" "commands" "result" "infile" "stdin"
|
||||||
|
|
||||||
|
# Corner cases
|
||||||
|
testing "sed no files (stdin)" 'sed ""' "hello\n" "" "hello\n"
|
||||||
|
@@ -225,7 +225,7 @@ testing "sed s/xxx/[/" "sed -e 's/xxx/[/
|
||||||
|
#testing "sed -g (exhaustive)" "sed -e 's/[[:space:]]*/,/g'" ",1,2,3,4,5," \
|
||||||
|
# "" "12345"
|
||||||
|
|
||||||
|
-# testing "description" "arguments" "result" "infile" "stdin"
|
||||||
|
+# testing "description" "commands" "result" "infile" "stdin"
|
||||||
|
|
||||||
|
testing "sed n command must reset 'substituted' bit" \
|
||||||
|
"sed 's/1/x/;T;n;: next;s/3/y/;t quit;n;b next;: quit;q'" \
|
||||||
|
@@ -291,6 +291,10 @@ testing "sed understands \r" \
|
||||||
|
"sed 's/r/\r/'" \
|
||||||
|
"\rrr\n" "" "rrr\n"
|
||||||
|
|
||||||
|
-# testing "description" "arguments" "result" "infile" "stdin"
|
||||||
|
+testing "sed -i finishes ranges correctly" \
|
||||||
|
+ "sed '1,2d' -i input; echo \$?; cat input" \
|
||||||
|
+ "0\n3\n4\n" "1\n2\n3\n4\n" ""
|
||||||
|
+
|
||||||
|
+# testing "description" "commands" "result" "infile" "stdin"
|
||||||
|
|
||||||
|
exit $FAILCOUNT
|
12
sdk_container/src/third_party/portage-stable/sys-apps/busybox/files/busybox-1.19.0-swap.patch
vendored
Normal file
12
sdk_container/src/third_party/portage-stable/sys-apps/busybox/files/busybox-1.19.0-swap.patch
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
--- busybox-1.19.0/util-linux/swaponoff.c
|
||||||
|
+++ busybox-1.19.0-swap/util-linux/swaponoff.c
|
||||||
|
@@ -114,7 +114,8 @@ int swap_on_off_main(int argc UNUSED_PAR
|
||||||
|
#if !ENABLE_FEATURE_SWAPON_PRI
|
||||||
|
ret = getopt32(argv, "a");
|
||||||
|
#else
|
||||||
|
- opt_complementary = "p+";
|
||||||
|
+ if (applet_name[5] == 'n')
|
||||||
|
+ opt_complementary = "p+";
|
||||||
|
ret = getopt32(argv, (applet_name[5] == 'n') ? "ap:" : "a", &g_flags);
|
||||||
|
|
||||||
|
if (ret & 2) { // -p
|
@ -0,0 +1,50 @@
|
|||||||
|
--- busybox-1.19.0/archival/libarchive/decompress_uncompress.c
|
||||||
|
+++ busybox-1.19.0-uncompress/archival/libarchive/decompress_uncompress.c
|
||||||
|
@@ -163,7 +163,8 @@ unpack_Z_stream(int fd_in, int fd_out)
|
||||||
|
|
||||||
|
if (insize < (int) (IBUFSIZ + 64) - IBUFSIZ) {
|
||||||
|
rsize = safe_read(fd_in, inbuf + insize, IBUFSIZ);
|
||||||
|
-//error check??
|
||||||
|
+ if (rsize < 0)
|
||||||
|
+ bb_error_msg(bb_msg_read_error);
|
||||||
|
insize += rsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -195,6 +196,8 @@ unpack_Z_stream(int fd_in, int fd_out)
|
||||||
|
|
||||||
|
|
||||||
|
if (oldcode == -1) {
|
||||||
|
+ if (code >= 256)
|
||||||
|
+ bb_error_msg_and_die("corrupted data"); /* %ld", code); */
|
||||||
|
oldcode = code;
|
||||||
|
finchar = (int) oldcode;
|
||||||
|
outbuf[outpos++] = (unsigned char) finchar;
|
||||||
|
@@ -239,6 +242,8 @@ unpack_Z_stream(int fd_in, int fd_out)
|
||||||
|
|
||||||
|
/* Generate output characters in reverse order */
|
||||||
|
while ((long) code >= (long) 256) {
|
||||||
|
+ if (stackp <= &htabof(0))
|
||||||
|
+ bb_error_msg_and_die("corrupted data");
|
||||||
|
*--stackp = tab_suffixof(code);
|
||||||
|
code = tab_prefixof(code);
|
||||||
|
}
|
||||||
|
@@ -263,8 +268,7 @@ unpack_Z_stream(int fd_in, int fd_out)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outpos >= OBUFSIZ) {
|
||||||
|
- full_write(fd_out, outbuf, outpos);
|
||||||
|
-//error check??
|
||||||
|
+ xwrite(fd_out, outbuf, outpos);
|
||||||
|
IF_DESKTOP(total_written += outpos;)
|
||||||
|
outpos = 0;
|
||||||
|
}
|
||||||
|
@@ -292,8 +296,7 @@ unpack_Z_stream(int fd_in, int fd_out)
|
||||||
|
} while (rsize > 0);
|
||||||
|
|
||||||
|
if (outpos > 0) {
|
||||||
|
- full_write(fd_out, outbuf, outpos);
|
||||||
|
-//error check??
|
||||||
|
+ xwrite(fd_out, outbuf, outpos);
|
||||||
|
IF_DESKTOP(total_written += outpos;)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user