summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko2008-08-21 08:32:12 +0000
committerDenis Vlasenko2008-08-21 08:32:12 +0000
commit2957fc699207d8e855c7024f8f91c451cf018952 (patch)
treece3a887e3f426a23735a211a5a6aa26415fe422e
parent6857e4e2f3ed59df9fe0d5ccbc518d126dd89dbc (diff)
downloadbusybox-2957fc699207d8e855c7024f8f91c451cf018952.zip
busybox-2957fc699207d8e855c7024f8f91c451cf018952.tar.gz
apply post-1.11.1 patches, bump version to 1.11.21_11_2
-rw-r--r--Makefile2
-rwxr-xr-xapplets/usage_compressed17
-rw-r--r--coreutils/basename.c2
-rw-r--r--modutils/insmod.c3
-rw-r--r--shell/ash.c72
5 files changed, 69 insertions, 27 deletions
diff --git a/Makefile b/Makefile
index 6d0cc38..fc9b3c1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
VERSION = 1
PATCHLEVEL = 11
-SUBLEVEL = 1
+SUBLEVEL = 2
EXTRAVERSION =
NAME = Unnamed
diff --git a/applets/usage_compressed b/applets/usage_compressed
index 551b4b4..05ceafd 100755
--- a/applets/usage_compressed
+++ b/applets/usage_compressed
@@ -14,14 +14,21 @@ exec >"$target"
echo 'static const char packed_usage[] ALIGN1 = {'
-# Extra effort to avoid using "od -t x1": -t is not available
-# in non-CONFIG_DESKTOPed busybox od
-
-"$loc/usage" | bzip2 -1 | od -v -x \
+## Breaks on big-endian systems!
+## # Extra effort to avoid using "od -t x1": -t is not available
+## # in non-CONFIG_DESKTOPed busybox od
+##
+## "$loc/usage" | bzip2 -1 | od -v -x \
+## | $SED -e 's/^[^ ]*//' \
+## | $SED -e 's/ //g' \
+## | grep -v '^$' \
+## | $SED -e 's/\(..\)\(..\)/0x\2,0x\1,/g'
+
+"$loc/usage" | bzip2 -1 | od -v -t x1 \
| $SED -e 's/^[^ ]*//' \
| $SED -e 's/ //g' \
| grep -v '^$' \
-| $SED -e 's/\(..\)\(..\)/0x\2,0x\1,/g'
+| $SED -e 's/\(..\)/0x\1,/g'
echo '};'
echo '#define SIZEOF_usage_messages' `expr 0 + $sz`
diff --git a/coreutils/basename.c b/coreutils/basename.c
index a3085ed..8a05e92 100644
--- a/coreutils/basename.c
+++ b/coreutils/basename.c
@@ -48,5 +48,5 @@ int basename_main(int argc, char **argv)
/* puts(s) will do, but we can do without stdio this way: */
s[m++] = '\n';
- return full_write(STDOUT_FILENO, s, m) == (ssize_t)m;
+ return full_write(STDOUT_FILENO, s, m) != (ssize_t)m;
}
diff --git a/modutils/insmod.c b/modutils/insmod.c
index 3fbb02b..569adac 100644
--- a/modutils/insmod.c
+++ b/modutils/insmod.c
@@ -840,7 +840,8 @@ arch_apply_relocation(struct obj_file *f,
ElfW(RelM) *rel, ElfW(Addr) v)
{
#if defined(__arm__) || defined(__i386__) || defined(__mc68000__) \
- || defined(__sh__) || defined(__s390__) || defined(__x86_64__)
+ || defined(__sh__) || defined(__s390__) || defined(__x86_64__) \
+ || defined(__powerpc__) || defined(__mips__)
struct arch_file *ifile = (struct arch_file *) f;
#endif
enum obj_reloc ret = obj_reloc_ok;
diff --git a/shell/ash.c b/shell/ash.c
index dd20fe3..45b0070 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -1569,14 +1569,14 @@ static char *optionarg; /* set by nextopt (like getopt) */
static char *optptr; /* used by nextopt */
/*
- * XXX - should get rid of. have all builtins use getopt(3). the
- * library getopt must have the BSD extension static variable "optreset"
- * otherwise it can't be used within the shell safely.
+ * XXX - should get rid of. Have all builtins use getopt(3).
+ * The library getopt must have the BSD extension static variable
+ * "optreset", otherwise it can't be used within the shell safely.
*
- * Standard option processing (a la getopt) for builtin routines. The
- * only argument that is passed to nextopt is the option string; the
- * other arguments are unnecessary. It return the character, or '\0' on
- * end of input.
+ * Standard option processing (a la getopt) for builtin routines.
+ * The only argument that is passed to nextopt is the option string;
+ * the other arguments are unnecessary. It returns the character,
+ * or '\0' on end of input.
*/
static int
nextopt(const char *optstring)
@@ -1587,13 +1587,20 @@ nextopt(const char *optstring)
p = optptr;
if (p == NULL || *p == '\0') {
+ /* We ate entire "-param", take next one */
p = *argptr;
- if (p == NULL || *p != '-' || *++p == '\0')
+ if (p == NULL)
+ return '\0';
+ if (*p != '-')
+ return '\0';
+ if (*++p == '\0') /* just "-" ? */
return '\0';
argptr++;
- if (LONE_DASH(p)) /* check for "--" */
+ if (LONE_DASH(p)) /* "--" ? */
return '\0';
+ /* p => next "-param" */
}
+ /* p => some option char in the middle of a "-param" */
c = *p++;
for (q = optstring; *q != c;) {
if (*q == '\0')
@@ -1602,8 +1609,11 @@ nextopt(const char *optstring)
q++;
}
if (*++q == ':') {
- if (*p == '\0' && (p = *argptr++) == NULL)
- ash_msg_and_raise_error("no arg for -%c option", c);
+ if (*p == '\0') {
+ p = *argptr++;
+ if (p == NULL)
+ ash_msg_and_raise_error("no arg for -%c option", c);
+ }
optionarg = p;
p = NULL;
}
@@ -7428,8 +7438,10 @@ commandcmd(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
else if (c != 'p')
abort();
#endif
- if (verify)
+ /* Mimic bash: just "command -v" doesn't complain, it's a nop */
+ if (verify && (*argptr != NULL)) {
return describe_command(*argptr, verify - VERIFY_BRIEF);
+ }
return 0;
}
@@ -7788,16 +7800,33 @@ static void prehash(union node *);
static void
evaltree(union node *n, int flags)
{
+
+ struct jmploc *volatile savehandler = exception_handler;
+ struct jmploc jmploc;
int checkexit = 0;
void (*evalfn)(union node *, int);
- unsigned isor;
int status;
+
if (n == NULL) {
TRACE(("evaltree(NULL) called\n"));
- goto out;
+ goto out1;
}
TRACE(("pid %d, evaltree(%p: %d, %d) called\n",
getpid(), n, n->type, flags));
+
+ exception_handler = &jmploc;
+ {
+ int err = setjmp(jmploc.loc);
+ if (err) {
+ /* if it was a signal, check for trap handlers */
+ if (exception == EXSIG)
+ goto out;
+ /* continue on the way out */
+ exception_handler = savehandler;
+ longjmp(exception_handler->loc, err);
+ }
+ }
+
switch (n->type) {
default:
#if DEBUG
@@ -7843,19 +7872,20 @@ evaltree(union node *n, int flags)
goto calleval;
case NAND:
case NOR:
- case NSEMI:
+ case NSEMI: {
+
#if NAND + 1 != NOR
#error NAND + 1 != NOR
#endif
#if NOR + 1 != NSEMI
#error NOR + 1 != NSEMI
#endif
- isor = n->type - NAND;
+ unsigned is_or = n->type - NAND;
evaltree(
n->nbinary.ch1,
- (flags | ((isor >> 1) - 1)) & EV_TESTED
+ (flags | ((is_or >> 1) - 1)) & EV_TESTED
);
- if (!exitstatus == isor)
+ if (!exitstatus == is_or)
break;
if (!evalskip) {
n = n->nbinary.ch2;
@@ -7866,6 +7896,7 @@ evaltree(union node *n, int flags)
break;
}
break;
+ }
case NIF:
evaltree(n->nif.test, EV_TESTED);
if (evalskip)
@@ -7886,8 +7917,11 @@ evaltree(union node *n, int flags)
exitstatus = status;
break;
}
+
out:
- if ((checkexit & exitstatus))
+ exception_handler = savehandler;
+ out1:
+ if (checkexit & exitstatus)
evalskip |= SKIPEVAL;
else if (pendingsig && dotrap())
goto exexit;