From e9f8b2f830bf0273d0d51f56d24da84b955e0df5 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Wed, 25 Jun 2008 11:01:42 +0000 Subject: [PATCH] apply post 1.10.3 patches, release 1.10.4 --- Makefile | 2 +- archival/libunarchive/get_header_tar.c | 16 ++--- networking/tcpudp.c | 1 + networking/udhcp/clientsocket.c | 2 +- shell/msh.c | 86 ++++++++++++++------------ util-linux/mount.c | 82 ++++++++++++------------ 6 files changed, 101 insertions(+), 88 deletions(-) diff --git a/Makefile b/Makefile index be843fc94..de855fe36 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 10 -SUBLEVEL = 3 +SUBLEVEL = 4 EXTRAVERSION = NAME = Unnamed diff --git a/archival/libunarchive/get_header_tar.c b/archival/libunarchive/get_header_tar.c index b1a797a08..187552c28 100644 --- a/archival/libunarchive/get_header_tar.c +++ b/archival/libunarchive/get_header_tar.c @@ -99,7 +99,7 @@ char get_header_tar(archive_handle_t *archive_handle) * "tar: A lone zero block at N", where N = kilobyte * where EOF was met (not EOF block, actual EOF!), * and tar will exit with error code 0. - * We will mimic exit(0), although we will not mimic + * We will mimic exit(EXIT_SUCCESS), although we will not mimic * the message and we don't check whether we indeed * saw zero block directly before this. */ if (i == 0) @@ -138,12 +138,12 @@ char get_header_tar(archive_handle_t *archive_handle) /* tar gz/bz autodetect: check for gz/bz2 magic. * If it is the very first block, and we see the magic, * we can switch to get_header_tar_gz/bz2/lzma(). - * Needs seekable fd. I wish recv(MSG_PEEK) would work + * Needs seekable fd. I wish recv(MSG_PEEK) works * on any fd... */ if (not_first) goto err; #if ENABLE_FEATURE_TAR_GZIP - if (tar.name[0] == 0x1f && tar.name[1] == 0x8b) { /* gzip */ + if (tar.name[0] == 0x1f && tar.name[1] == (char)0x8b) { /* gzip */ get_header_ptr = get_header_tar_gz; } else #endif @@ -220,9 +220,7 @@ char get_header_tar(archive_handle_t *archive_handle) } file_header->link_target = NULL; if (!linkname && parse_names && tar.linkname[0]) { - /* we trash magic[0] here, it's ok */ - tar.linkname[sizeof(tar.linkname)] = '\0'; - file_header->link_target = xstrdup(tar.linkname); + file_header->link_target = xstrndup(tar.linkname, sizeof(tar.linkname)); /* FIXME: what if we have non-link object with link_target? */ /* Will link_target be free()ed? */ } @@ -240,10 +238,12 @@ char get_header_tar(archive_handle_t *archive_handle) file_header->name = NULL; if (!longname && parse_names) { /* we trash mode[0] here, it's ok */ - tar.name[sizeof(tar.name)] = '\0'; + //tar.name[sizeof(tar.name)] = '\0'; - gcc 4.3.0 would complain + tar.mode[0] = '\0'; if (tar.prefix[0]) { /* and padding[0] */ - tar.prefix[sizeof(tar.prefix)] = '\0'; + //tar.prefix[sizeof(tar.prefix)] = '\0'; - gcc 4.3.0 would complain + tar.padding[0] = '\0'; file_header->name = concat_path_file(tar.prefix, tar.name); } else file_header->name = xstrdup(tar.name); diff --git a/networking/tcpudp.c b/networking/tcpudp.c index 0b604af48..07a87b8ed 100644 --- a/networking/tcpudp.c +++ b/networking/tcpudp.c @@ -31,6 +31,7 @@ #include "libbb.h" /* Wants etc, thus included after libbb.h: */ +#include /* for __be32 etc */ #include // TODO: move into this file: diff --git a/networking/udhcp/clientsocket.c b/networking/udhcp/clientsocket.c index 114200192..6185610be 100644 --- a/networking/udhcp/clientsocket.c +++ b/networking/udhcp/clientsocket.c @@ -76,7 +76,7 @@ int raw_socket(int ifindex) BPF_STMT(BPF_LD|BPF_W|BPF_IND, 0), BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, SERVER_AND_CLIENT_PORTS, 0, 1), /* L3, L4 */ /* returns */ - BPF_STMT(BPF_RET|BPF_K, (~(uint32_t)0) ), /* L3: pass */ + BPF_STMT(BPF_RET|BPF_K, 0x0fffffff), /* L3: pass */ BPF_STMT(BPF_RET|BPF_K, 0), /* L4: reject */ }; static const struct sock_fprog filter_prog = { diff --git a/shell/msh.c b/shell/msh.c index 63f365962..2b6b3853f 100644 --- a/shell/msh.c +++ b/shell/msh.c @@ -92,17 +92,17 @@ static char *itoa(int n) #ifdef MSHDEBUG static int mshdbg = MSHDEBUG; -#define DBGPRINTF(x) if (mshdbg>0) printf x -#define DBGPRINTF0(x) if (mshdbg>0) printf x -#define DBGPRINTF1(x) if (mshdbg>1) printf x -#define DBGPRINTF2(x) if (mshdbg>2) printf x -#define DBGPRINTF3(x) if (mshdbg>3) printf x -#define DBGPRINTF4(x) if (mshdbg>4) printf x -#define DBGPRINTF5(x) if (mshdbg>5) printf x -#define DBGPRINTF6(x) if (mshdbg>6) printf x -#define DBGPRINTF7(x) if (mshdbg>7) printf x -#define DBGPRINTF8(x) if (mshdbg>8) printf x -#define DBGPRINTF9(x) if (mshdbg>9) printf x +#define DBGPRINTF(x) if (mshdbg > 0) printf x +#define DBGPRINTF0(x) if (mshdbg > 0) printf x +#define DBGPRINTF1(x) if (mshdbg > 1) printf x +#define DBGPRINTF2(x) if (mshdbg > 2) printf x +#define DBGPRINTF3(x) if (mshdbg > 3) printf x +#define DBGPRINTF4(x) if (mshdbg > 4) printf x +#define DBGPRINTF5(x) if (mshdbg > 5) printf x +#define DBGPRINTF6(x) if (mshdbg > 6) printf x +#define DBGPRINTF7(x) if (mshdbg > 7) printf x +#define DBGPRINTF8(x) if (mshdbg > 8) printf x +#define DBGPRINTF9(x) if (mshdbg > 9) printf x static int mshdbg_rc = 0; @@ -124,7 +124,7 @@ static int mshdbg_rc = 0; #define RCPRINTF(x) ((void)0) -#endif /* MSHDEBUG */ +#endif /* MSHDEBUG */ #if ENABLE_FEATURE_EDITING_FANCY_PROMPT @@ -141,13 +141,13 @@ static int mshdbg_rc = 0; * shell */ -#define LINELIM 2100 -#define NPUSH 8 /* limit to input nesting */ +#define LINELIM 2100 +#define NPUSH 8 /* limit to input nesting */ #undef NOFILE -#define NOFILE 20 /* Number of open files */ -#define NUFILE 10 /* Number of user-accessible files */ -#define FDBASE 10 /* First file usable by Shell */ +#define NOFILE 20 /* Number of open files */ +#define NUFILE 10 /* Number of user-accessible files */ +#define FDBASE 10 /* First file usable by Shell */ /* * values returned by wait @@ -159,7 +159,7 @@ static int mshdbg_rc = 0; /* * library and system definitions */ -typedef void xint; /* base type of jmp_buf, for not broken compilers */ +typedef void xint; /* base type of jmp_buf, for not broken compilers */ /* * shell components @@ -588,14 +588,13 @@ static const struct builtincmd builtincmds[] = { { NULL , NULL }, }; -static struct op *scantree(struct op *); static struct op *dowholefile(int /*, int*/); /* Globals */ static char **dolv; static int dolc; -static int exstat; +static uint8_t exstat; static smallint gflg; /* (seems to be a parse error indicator) */ static smallint interactive; /* Is this an interactive shell */ static smallint execflg; @@ -726,7 +725,7 @@ static void print_tree(struct op *head) return; } - DBGPRINTF(("NODE: %p, left %p, right %p\n", head, head->left, + DBGPRINTF(("NODE: %p, left %p, right %p\n", head, head->left, head->right)); if (head->left) @@ -744,7 +743,7 @@ static void print_tree(struct op *head) static void prs(const char *s) { if (*s) - write(2, s, strlen(s)); + write(STDERR_FILENO, s, strlen(s)); } static void prn(unsigned u) @@ -807,7 +806,8 @@ static void warn(const char *s) { if (*s) { prs(s); - exstat = -1; + if (!exstat) + exstat = 255; } prs("\n"); if (FLAG['e']) @@ -1278,6 +1278,7 @@ static int newfile(char *s) } +#ifdef UNUSED struct op *scantree(struct op *head) { struct op *dotnode; @@ -1309,6 +1310,7 @@ struct op *scantree(struct op *head) return NULL; } +#endif static void onecommand(void) @@ -2740,7 +2742,7 @@ static int forkexec(struct op *t, int *pin, int *pout, int no_fork, char **wp) // longjmps away (at "Run builtin" below), leaving t->op_words clobbered! // See http://bugs.busybox.net/view.php?id=846. // Now we do not touch t->op_words, but separately pass wp as param list - // to builtins + // to builtins DBGPRINTF(("FORKEXEC: bltin %p, no_fork %d, owp %p\n", bltin, no_fork, owp)); /* Don't fork if it is a lone builtin (not in pipe) @@ -2854,7 +2856,7 @@ static int forkexec(struct op *t, int *pin, int *pout, int no_fork, char **wp) if (t->op_type == TPAREN) _exit(execute(t->left, NOPIPE, NOPIPE, /* no_fork: */ 1)); if (wp[0] == NULL) - _exit(0); + _exit(EXIT_SUCCESS); cp = rexecve(wp[0], wp, makenv(0, NULL)); prs(wp[0]); @@ -3006,7 +3008,7 @@ static int waitfor(int lastpid, int canintr) prs(" - core dumped"); if (rv >= ARRAY_SIZE(signame) || signame[rv]) prs("\n"); - rv = -1; + rv |= 0x80; } else rv = WAITVAL(s); } @@ -3070,8 +3072,6 @@ static const char *rexecve(char *c, char **v, char **envp) if (tp != global_env.linep) *tp++ = '/'; strcpy(tp, c); - //for (i = 0; (*tp++ = c[i++]) != '\0';) - // continue; DBGPRINTF3(("REXECVE: global_env.linep is %s\n", global_env.linep)); @@ -3079,10 +3079,13 @@ static const char *rexecve(char *c, char **v, char **envp) switch (errno) { case ENOEXEC: + /* File is executable but file format isnt recognized */ + /* Run it as a shell script */ + /* (execve above didnt do it itself, unlike execvp) */ *v = global_env.linep; v--; tp = *v; - *v = global_env.linep; + *v = (char*)DEFAULT_SHELL; execve(DEFAULT_SHELL, v, envp); *v = tp; return "no shell"; @@ -3094,7 +3097,12 @@ static const char *rexecve(char *c, char **v, char **envp) return "argument list too long"; } } - return errno == ENOENT ? "not found" : "cannot execute"; + if (errno == ENOENT) { + exstat = 127; /* standards require this */ + return "not found"; + } + exstat = 126; /* mimic bash */ + return "cannot execute"; } /* @@ -3383,7 +3391,7 @@ static int doread(struct op *t ATTRIBUTE_UNUSED, char **args) } for (wp = args + 1; *wp; wp++) { for (cp = global_env.linep; !nl && cp < elinep - 1; cp++) { - nb = nonblock_safe_read(0, cp, sizeof(*cp)); + nb = nonblock_safe_read(STDIN_FILENO, cp, sizeof(*cp)); if (nb != sizeof(*cp)) break; nl = (*cp == '\n'); @@ -4206,7 +4214,7 @@ static int grave(int quoted) prs(argument_list[0]); prs(": "); err(cp); - _exit(1); + _exit(EXIT_FAILURE); } @@ -4308,9 +4316,7 @@ static void globname(char *we, char *pp) dname[NAME_MAX] = '\0'; while ((de = readdir(dirp)) != NULL) { /* XXX Hmmm... What this could be? (abial) */ - /* - if (ent[j].d_ino == 0) - continue; + /* if (ent[j].d_ino == 0) continue; */ strncpy(dname, de->d_name, NAME_MAX); if (dname[0] == '.') @@ -4521,7 +4527,7 @@ static int readc(void) static void ioecho(char c) { if (FLAG['v']) - write(2, &c, sizeof c); + write(STDERR_FILENO, &c, sizeof c); } static void pushio(struct ioarg *argp, int (*fn) (struct ioarg *)) @@ -4732,7 +4738,7 @@ static int filechar(struct ioarg *ap) while (size == 0 || position >= size) { size = read_line_input(current_prompt, filechar_cmdbuf, BUFSIZ, line_input_state); if (size < 0) /* Error/EOF */ - exit(0); + exit(EXIT_SUCCESS); position = 0; /* if Ctrl-C, size == 0 and loop will repeat */ } @@ -4817,7 +4823,7 @@ static int linechar(struct ioarg *ap) } /* - * remap fd into Shell's fd space + * Remap fd into shell's fd space */ static int remap(int fd) { @@ -5203,7 +5209,7 @@ int msh_main(int argc, char **argv) /* Shell is non-interactive, activate printf-based debug */ #ifdef MSHDEBUG - mshdbg = (int) (((char) (mshdbg_var->value[0])) - '0'); + mshdbg = mshdbg_var->value[0] - '0'; if (mshdbg < 0) mshdbg = 0; #endif @@ -5211,7 +5217,7 @@ int msh_main(int argc, char **argv) name = *++argv; if (newfile(name)) - exit(1); /* Exit on error */ + exit(EXIT_FAILURE); /* Exit on error */ } } diff --git a/util-linux/mount.c b/util-linux/mount.c index bd5f27b2e..53d91f387 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c @@ -1059,6 +1059,7 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) if (filteropts) for (opt = strtok(filteropts, ","); opt; opt = strtok(NULL, ",")) { char *opteq = strchr(opt, '='); if (opteq) { + int val, idx; static const char options[] ALIGN1 = /* 0 */ "rsize\0" /* 1 */ "wsize\0" @@ -1081,87 +1082,92 @@ static int nfsmount(struct mntent *mp, long vfsflags, char *filteropts) /* 18 */ "proto\0" /* 19 */ "namlen\0" /* 20 */ "addr\0"; - int val = xatoi_u(opteq + 1); - *opteq = '\0'; - switch (index_in_strings(options, opt)) { + + *opteq++ = '\0'; + idx = index_in_strings(options, opt); + switch (idx) { + case 12: // "mounthost" + mounthost = xstrndup(opteq, + strcspn(opteq, " \t\n\r,")); + continue; + case 18: // "proto" + if (!strncmp(opteq, "tcp", 3)) + tcp = 1; + else if (!strncmp(opteq, "udp", 3)) + tcp = 0; + else + bb_error_msg("warning: unrecognized proto= option"); + continue; + case 20: // "addr" - ignore + continue; + } + + val = xatoi_u(opteq); + switch (idx) { case 0: // "rsize" data.rsize = val; - break; + continue; case 1: // "wsize" data.wsize = val; - break; + continue; case 2: // "timeo" data.timeo = val; - break; + continue; case 3: // "retrans" data.retrans = val; - break; + continue; case 4: // "acregmin" data.acregmin = val; - break; + continue; case 5: // "acregmax" data.acregmax = val; - break; + continue; case 6: // "acdirmin" data.acdirmin = val; - break; + continue; case 7: // "acdirmax" data.acdirmax = val; - break; + continue; case 8: // "actimeo" data.acregmin = val; data.acregmax = val; data.acdirmin = val; data.acdirmax = val; - break; + continue; case 9: // "retry" retry = val; - break; + continue; case 10: // "port" port = val; - break; + continue; case 11: // "mountport" mountport = val; - break; - case 12: // "mounthost" - mounthost = xstrndup(opteq+1, - strcspn(opteq+1," \t\n\r,")); - break; + continue; case 13: // "mountprog" mountprog = val; - break; + continue; case 14: // "mountvers" mountvers = val; - break; + continue; case 15: // "nfsprog" nfsprog = val; - break; + continue; case 16: // "nfsvers" case 17: // "vers" nfsvers = val; - break; - case 18: // "proto" - if (!strncmp(opteq+1, "tcp", 3)) - tcp = 1; - else if (!strncmp(opteq+1, "udp", 3)) - tcp = 0; - else - bb_error_msg("warning: unrecognized proto= option"); - break; + continue; case 19: // "namlen" - if (nfs_mount_version >= 2) + //if (nfs_mount_version >= 2) data.namlen = val; - else - bb_error_msg("warning: option namlen is not supported\n"); - break; - case 20: // "addr" - ignore - break; + //else + // bb_error_msg("warning: option namlen is not supported\n"); + continue; default: bb_error_msg("unknown nfs mount parameter: %s=%d", opt, val); goto fail; } } - else { + else { /* not of the form opt=val */ static const char options[] ALIGN1 = "bg\0" "fg\0" -- 2.25.1