From cc272b06eefb87030bb85b686abdbc22b5ed1c34 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 28 Aug 2011 13:00:29 +0200 Subject: Apply post-1.19.0 patches, bump version to 1.19.1 Signed-off-by: Denys Vlasenko --- Makefile | 2 +- archival/libarchive/decompress_uncompress.c | 13 +++-- editors/sed.c | 79 +++++++++++++++++++---------- findutils/find.c | 5 +- findutils/grep.c | 22 ++++---- include/platform.h | 2 + libbb/getpty.c | 18 ++++--- libbb/match_fstype.c | 4 ++ libbb/procps.c | 34 +++++++------ libbb/udp_io.c | 2 +- miscutils/less.c | 7 +-- shell/cttyhack.c | 8 +-- testsuite/sed.tests | 10 ++-- util-linux/swaponoff.c | 3 +- 14 files changed, 131 insertions(+), 78 deletions(-) diff --git a/Makefile b/Makefile index 7a1abda1b..138d1d425 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 19 -SUBLEVEL = 0 +SUBLEVEL = 1 EXTRAVERSION = NAME = Unnamed diff --git a/archival/libarchive/decompress_uncompress.c b/archival/libarchive/decompress_uncompress.c index 44d894244..d1061a2bb 100644 --- a/archival/libarchive/decompress_uncompress.c +++ b/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_and_die(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;) } diff --git a/editors/sed.c b/editors/sed.c index 5c4e9cc3b..1552cf370 100644 --- a/editors/sed.c +++ b/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 **argv) 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 **argv) 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 **argv) * 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) diff --git a/findutils/find.c b/findutils/find.c index 05f88d2f0..fc0fc5c9f 100644 --- a/findutils/find.c +++ b/findutils/find.c @@ -932,7 +932,10 @@ static action*** parse_params(char **argv) * expression is reached. */ /* Options */ - if (0) { } + if (parm == OPT_FOLLOW) { + dbg("follow enabled: %d", __LINE__); + G.recurse_flags |= ACTION_FOLLOWLINKS | ACTION_DANGLING_OK; + } #if ENABLE_FEATURE_FIND_XDEV else if (parm == OPT_XDEV) { dbg("%d", __LINE__); diff --git a/findutils/grep.c b/findutils/grep.c index 3acfa9197..5f4224203 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -562,20 +562,20 @@ static char *add_grep_list_data(char *pattern) static void load_regexes_from_file(llist_t *fopt) { - char *line; - FILE *f; - while (fopt) { + char *line; + FILE *fp; llist_t *cur = fopt; char *ffile = cur->data; fopt = cur->link; free(cur); - f = xfopen_stdin(ffile); - while ((line = xmalloc_fgetline(f)) != NULL) { + fp = xfopen_stdin(ffile); + while ((line = xmalloc_fgetline(fp)) != NULL) { llist_add_to(&pattern_head, new_grep_list_data(line, ALLOCATED)); } + fclose_if_not_stdin(fp); } } @@ -659,15 +659,19 @@ int grep_main(int argc UNUSED_PARAM, char **argv) #endif invert_search = ((option_mask32 & OPT_v) != 0); /* 0 | 1 */ - if (pattern_head != NULL) { - /* convert char **argv to grep_list_data_t */ + { /* convert char **argv to grep_list_data_t */ llist_t *cur; - for (cur = pattern_head; cur; cur = cur->link) cur->data = new_grep_list_data(cur->data, 0); } - if (option_mask32 & OPT_f) + if (option_mask32 & OPT_f) { load_regexes_from_file(fopt); + if (!pattern_head) { /* -f EMPTY_FILE? */ + /* GNU grep treats it as "nothing matches" */ + llist_add_to(&pattern_head, new_grep_list_data((char*) "", 0)); + invert_search ^= 1; + } + } if (ENABLE_FEATURE_GREP_FGREP_ALIAS && applet_name[0] == 'f') option_mask32 |= OPT_F; diff --git a/include/platform.h b/include/platform.h index e22dbdb4a..826a4c497 100644 --- a/include/platform.h +++ b/include/platform.h @@ -417,6 +417,8 @@ typedef unsigned smalluint; # undef HAVE_STRVERSCMP # undef HAVE_XTABS # undef HAVE_DPRINTF +# undef HAVE_UNLOCKED_STDIO +# undef HAVE_UNLOCKED_LINE_OPS #endif #if defined(__FreeBSD__) diff --git a/libbb/getpty.c b/libbb/getpty.c index 6a15cff2f..435e4d09f 100644 --- a/libbb/getpty.c +++ b/libbb/getpty.c @@ -19,20 +19,22 @@ int FAST_FUNC xgetpty(char *line) if (p > 0) { grantpt(p); /* chmod+chown corresponding slave pty */ unlockpt(p); /* (what does this do?) */ -#ifndef HAVE_PTSNAME_R - const char *name; - name = ptsname(p); /* find out the name of slave pty */ - if (!name) { - bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)"); +# ifndef HAVE_PTSNAME_R + { + const char *name; + name = ptsname(p); /* find out the name of slave pty */ + if (!name) { + bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)"); + } + safe_strncpy(line, name, GETPTY_BUFSIZE); } - safe_strncpy(line, name, GETPTY_BUFSIZE); -#else +# else /* find out the name of slave pty */ if (ptsname_r(p, line, GETPTY_BUFSIZE-1) != 0) { bb_perror_msg_and_die("ptsname error (is /dev/pts mounted?)"); } line[GETPTY_BUFSIZE-1] = '\0'; -#endif +# endif return p; } #else diff --git a/libbb/match_fstype.c b/libbb/match_fstype.c index 83d6e6770..c792d13b3 100644 --- a/libbb/match_fstype.c +++ b/libbb/match_fstype.c @@ -10,6 +10,8 @@ * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ +#ifdef HAVE_MNTENT_H + #include "libbb.h" int FAST_FUNC match_fstype(const struct mntent *mt, const char *t_fstype) @@ -40,3 +42,5 @@ int FAST_FUNC match_fstype(const struct mntent *mt, const char *t_fstype) return !match; } + +#endif /* HAVE_MNTENT_H */ diff --git a/libbb/procps.c b/libbb/procps.c index 1dea61518..e15ddd1e5 100644 --- a/libbb/procps.c +++ b/libbb/procps.c @@ -284,27 +284,25 @@ int FAST_FUNC procps_read_smaps(pid_t pid, struct smaprec *total, void BUG_comm_size(void); procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags) { - struct dirent *entry; - char buf[PROCPS_BUFSIZE]; - char filename[sizeof("/proc//cmdline") + sizeof(int)*3]; - char *filename_tail; - long tasknice; - unsigned pid; - int n; - struct stat sb; - if (!sp) sp = alloc_procps_scan(); for (;;) { + struct dirent *entry; + char buf[PROCPS_BUFSIZE]; + long tasknice; + unsigned pid; + int n; + char filename[sizeof("/proc/%u/task/%u/cmdline") + sizeof(int)*3 * 2]; + char *filename_tail; + #if ENABLE_FEATURE_SHOW_THREADS - if ((flags & PSSCAN_TASKS) && sp->task_dir) { + if (sp->task_dir) { entry = readdir(sp->task_dir); if (entry) goto got_entry; closedir(sp->task_dir); sp->task_dir = NULL; - sp->main_thread_pid = 0; } #endif entry = readdir(sp->dir); @@ -321,9 +319,9 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags) /* We found another /proc/PID. Do not use it, * there will be /proc/PID/task/PID (same PID!), * so just go ahead and dive into /proc/PID/task. */ - char task_dir[sizeof("/proc/%u/task") + sizeof(int)*3]; - sprintf(task_dir, "/proc/%u/task", pid); - sp->task_dir = xopendir(task_dir); + sprintf(filename, "/proc/%u/task", pid); + /* Note: if opendir fails, we just go to next /proc/XXX */ + sp->task_dir = opendir(filename); sp->main_thread_pid = pid; continue; } @@ -347,9 +345,15 @@ procps_status_t* FAST_FUNC procps_scan(procps_status_t* sp, int flags) } #endif - filename_tail = filename + sprintf(filename, "/proc/%u/", pid); +#if ENABLE_FEATURE_SHOW_THREADS + if (sp->task_dir) + filename_tail = filename + sprintf(filename, "/proc/%u/task/%u/", sp->main_thread_pid, pid); + else +#endif + filename_tail = filename + sprintf(filename, "/proc/%u/", pid); if (flags & PSSCAN_UIDGID) { + struct stat sb; if (stat(filename, &sb)) continue; /* process probably exited */ /* Effective UID/GID, not real */ diff --git a/libbb/udp_io.c b/libbb/udp_io.c index b8fb6755d..7985a9723 100644 --- a/libbb/udp_io.c +++ b/libbb/udp_io.c @@ -13,7 +13,7 @@ * We don't check for errors here. Not supported == won't be used */ void FAST_FUNC -socket_want_pktinfo(int fd) +socket_want_pktinfo(int fd UNUSED_PARAM) { #ifdef IP_PKTINFO setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &const_int_1, sizeof(int)); diff --git a/miscutils/less.c b/miscutils/less.c index 9543fb9f9..045fd2db3 100644 --- a/miscutils/less.c +++ b/miscutils/less.c @@ -721,8 +721,8 @@ static void print_found(const char *line) while (match_status == 0) { char *new = xasprintf("%s%.*s"HIGHLIGHT"%.*s"NORMAL, growline ? growline : "", - match_structs.rm_so, str, - match_structs.rm_eo - match_structs.rm_so, + (int)match_structs.rm_so, str, + (int)(match_structs.rm_eo - match_structs.rm_so), str + match_structs.rm_so); free(growline); growline = new; @@ -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) diff --git a/shell/cttyhack.c b/shell/cttyhack.c index 4261289b4..37ea13723 100644 --- a/shell/cttyhack.c +++ b/shell/cttyhack.c @@ -122,10 +122,12 @@ int cttyhack_main(int argc UNUSED_PARAM, char **argv) 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; } diff --git a/testsuite/sed.tests b/testsuite/sed.tests index e9d0ed601..ba163e9e9 100755 --- a/testsuite/sed.tests +++ b/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/[/'" "[\n" "" "xxx\n" #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 diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c index 43ddb4031..e53e24c71 100644 --- a/util-linux/swaponoff.c +++ b/util-linux/swaponoff.c @@ -114,7 +114,8 @@ int swap_on_off_main(int argc UNUSED_PARAM, char **argv) #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 -- cgit v1.2.3-55-g6feb From ed058016bf8fc98271de2e58bfb650de9e9d304d Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Sep 2011 04:31:16 +0200 Subject: Apply post-1.19.1 patches, bump version to 1.19.2 Signed-off-by: Denys Vlasenko --- Makefile | 2 +- editors/patch.c | 8 +++----- libbb/lineedit.c | 2 +- libbb/match_fstype.c | 4 ++-- shell/hush.c | 18 +++++++++++------- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 138d1d425..2cac36c00 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 19 -SUBLEVEL = 1 +SUBLEVEL = 2 EXTRAVERSION = NAME = Unnamed diff --git a/editors/patch.c b/editors/patch.c index ec5b8e7ad..1f2a49b66 100644 --- a/editors/patch.c +++ b/editors/patch.c @@ -70,8 +70,7 @@ struct double_list { // Free all the elements of a linked list // Call freeit() on each element before freeing it. -static -void dlist_free(struct double_list *list, void (*freeit)(void *data)) +static void dlist_free(struct double_list *list, void (*freeit)(void *data)) { while (list) { void *pop = list; @@ -83,8 +82,7 @@ void dlist_free(struct double_list *list, void (*freeit)(void *data)) } // Add an entry before "list" element in (circular) doubly linked list -static -struct double_list *dlist_add(struct double_list **list, char *data) +static struct double_list *dlist_add(struct double_list **list, char *data) { struct double_list *llist; struct double_list *line = xmalloc(sizeof(*line)); @@ -232,7 +230,7 @@ static int apply_one_hunk(void) else matcheof = 0; if (PATCH_DEBUG) fdprintf(2, "HUNK:%s\n", plist->data); } - matcheof = matcheof < TT.context; + matcheof = !matcheof || matcheof < TT.context; if (PATCH_DEBUG) fdprintf(2,"MATCHEOF=%c\n", matcheof ? 'Y' : 'N'); diff --git a/libbb/lineedit.c b/libbb/lineedit.c index 10265192e..2ea373c2c 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c @@ -1425,7 +1425,7 @@ static void save_history(char *str) /* write out temp file and replace hist_file atomically */ new_name = xasprintf("%s.%u.new", state->hist_file, (int) getpid()); - fd = open(state->hist_file, O_WRONLY | O_CREAT | O_TRUNC, 0600); + fd = open(new_name, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (fd >= 0) { FILE *fp; int i; diff --git a/libbb/match_fstype.c b/libbb/match_fstype.c index c792d13b3..32c3d7f18 100644 --- a/libbb/match_fstype.c +++ b/libbb/match_fstype.c @@ -10,10 +10,10 @@ * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ -#ifdef HAVE_MNTENT_H - #include "libbb.h" +#ifdef HAVE_MNTENT_H + int FAST_FUNC match_fstype(const struct mntent *mt, const char *t_fstype) { int match = 1; diff --git a/shell/hush.c b/shell/hush.c index e4138adf7..de0af9cec 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -7817,20 +7817,24 @@ int hush_main(int argc, char **argv) #if ENABLE_FEATURE_EDITING G.line_input_state = new_line_input_t(FOR_SHELL); -# if defined MAX_HISTORY && MAX_HISTORY > 0 && ENABLE_HUSH_SAVEHISTORY +# if MAX_HISTORY > 0 && ENABLE_HUSH_SAVEHISTORY { const char *hp = get_local_var_value("HISTFILE"); if (!hp) { hp = get_local_var_value("HOME"); - if (hp) { - G.line_input_state->hist_file = concat_path_file(hp, ".hush_history"); - //set_local_var(xasprintf("HISTFILE=%s", ...)); - } + if (hp) + hp = concat_path_file(hp, ".hush_history"); + } else { + hp = xstrdup(hp); } -# if ENABLE_FEATURE_SH_HISTFILESIZE + if (hp) { + G.line_input_state->hist_file = hp; + //set_local_var(xasprintf("HISTFILE=%s", ...)); + } +# if ENABLE_FEATURE_SH_HISTFILESIZE hp = get_local_var_value("HISTFILESIZE"); G.line_input_state->max_history = size_from_HISTFILESIZE(hp); -# endif +# endif } # endif #endif -- cgit v1.2.3-55-g6feb From 1e98f3741c5a844c1d3d7966f20cd09dded05d0d Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Fri, 28 Oct 2011 17:48:15 +0200 Subject: Apply post-1.19.2 patches, bump version to 1.19.3 Signed-off-by: Denys Vlasenko --- Makefile | 2 +- applets/applet_tables.c | 9 ++++++++- coreutils/tail.c | 6 +++--- include/platform.h | 2 +- loginutils/chpasswd.c | 17 +++++++++++------ miscutils/crond.c | 3 ++- networking/inetd.c | 14 ++++++++++---- networking/tftp.c | 3 ++- sysklogd/syslogd.c | 12 ++++++++++-- testsuite/tail.tests | 8 ++++++++ 10 files changed, 56 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 2cac36c00..9648c9c20 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 19 -SUBLEVEL = 2 +SUBLEVEL = 3 EXTRAVERSION = NAME = Unnamed diff --git a/applets/applet_tables.c b/applets/applet_tables.c index 3859d7326..a47574737 100644 --- a/applets/applet_tables.c +++ b/applets/applet_tables.c @@ -80,8 +80,15 @@ int main(int argc, char **argv) printf("#define NUM_APPLETS %u\n", NUM_APPLETS); if (NUM_APPLETS == 1) { + char *dash_to_underscore, *p; printf("#define SINGLE_APPLET_STR \"%s\"\n", applets[0].name); - printf("#define SINGLE_APPLET_MAIN %s_main\n", applets[0].name); + /* Example: "ether-wake" -> "ether_wake" */ + p = dash_to_underscore = strdup(applets[0].name); + p--; + while (*++p) + if (*p == '-') + *p = '_'; + printf("#define SINGLE_APPLET_MAIN %s_main\n", dash_to_underscore); } printf("\n"); diff --git a/coreutils/tail.c b/coreutils/tail.c index 454c25936..43cecbd97 100644 --- a/coreutils/tail.c +++ b/coreutils/tail.c @@ -203,7 +203,7 @@ int tail_main(int argc, char **argv) int fd = fds[i]; if (ENABLE_FEATURE_FANCY_TAIL && fd < 0) - continue; /* may happen with -E */ + continue; /* may happen with -F */ if (nfiles > header_threshhold) { tail_xprint_header(fmt, argv[i]); @@ -252,14 +252,14 @@ int tail_main(int argc, char **argv) * Used only by +N code ("start from Nth", 1-based): */ seen = 1; newlines_seen = 0; - while ((nread = tail_read(fd, buf, tailbufsize-taillen)) > 0) { + while ((nread = tail_read(fd, buf, tailbufsize - taillen)) > 0) { if (G.from_top) { int nwrite = nread; if (seen < count) { /* We need to skip a few more bytes/lines */ if (COUNT_BYTES) { nwrite -= (count - seen); - seen = count; + seen += nread; } else { char *s = buf; do { diff --git a/include/platform.h b/include/platform.h index 826a4c497..aa1bc331b 100644 --- a/include/platform.h +++ b/include/platform.h @@ -433,7 +433,7 @@ typedef unsigned smalluint; # undef HAVE_STPCPY #endif -#if defined(ANDROID) +#if defined(ANDROID) || defined(__ANDROID__) # undef HAVE_DPRINTF # undef HAVE_GETLINE # undef HAVE_STPCPY diff --git a/loginutils/chpasswd.c b/loginutils/chpasswd.c index 2262b792a..b7df57e5d 100644 --- a/loginutils/chpasswd.c +++ b/loginutils/chpasswd.c @@ -33,9 +33,8 @@ static const char chpasswd_longopts[] ALIGN1 = int chpasswd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int chpasswd_main(int argc UNUSED_PARAM, char **argv) { - char *name, *pass; - char salt[sizeof("$N$XXXXXXXX")]; - int opt, rc; + char *name; + int opt; if (getuid() != 0) bb_error_msg_and_die(bb_msg_perm_denied_are_you_root); @@ -45,6 +44,10 @@ int chpasswd_main(int argc UNUSED_PARAM, char **argv) opt = getopt32(argv, "em"); while ((name = xmalloc_fgetline(stdin)) != NULL) { + char *free_me; + char *pass; + int rc; + pass = strchr(name, ':'); if (!pass) bb_error_msg_and_die("missing new password"); @@ -52,7 +55,10 @@ int chpasswd_main(int argc UNUSED_PARAM, char **argv) xuname2uid(name); /* dies if there is no such user */ + free_me = NULL; if (!(opt & OPT_ENC)) { + char salt[sizeof("$N$XXXXXXXX")]; + crypt_make_salt(salt, 1); if (opt & OPT_MD5) { salt[0] = '$'; @@ -60,7 +66,7 @@ int chpasswd_main(int argc UNUSED_PARAM, char **argv) salt[2] = '$'; crypt_make_salt(salt + 3, 4); } - pass = pw_encrypt(pass, salt, 0); + free_me = pass = pw_encrypt(pass, salt, 0); } /* This is rather complex: if user is not found in /etc/shadow, @@ -81,8 +87,7 @@ int chpasswd_main(int argc UNUSED_PARAM, char **argv) bb_info_msg("Password for '%s' changed", name); logmode = LOGMODE_STDIO; free(name); - if (!(opt & OPT_ENC)) - free(pass); + free(free_me); } return EXIT_SUCCESS; } diff --git a/miscutils/crond.c b/miscutils/crond.c index 014016fb6..a0b73c774 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -861,7 +861,8 @@ int crond_main(int argc UNUSED_PARAM, char **argv) /* "-b after -f is ignored", and so on for every pair a-b */ opt_complementary = "f-b:b-f:S-L:L-S" IF_FEATURE_CROND_D(":d-l") - ":l+:d+"; /* -l and -d have numeric param */ + /* -l and -d have numeric param */ + ":l+" IF_FEATURE_CROND_D(":d+"); opts = getopt32(argv, "l:L:fbSc:" IF_FEATURE_CROND_D("d:"), &G.log_level, &G.log_filename, &G.crontab_dir_name IF_FEATURE_CROND_D(,&G.log_level)); diff --git a/networking/inetd.c b/networking/inetd.c index 873fd9528..05ad8c792 100644 --- a/networking/inetd.c +++ b/networking/inetd.c @@ -1278,6 +1278,7 @@ int inetd_main(int argc UNUSED_PARAM, char **argv) sep->se_count = 0; rearm_alarm(); /* will revive it in RETRYTIME sec */ restore_sigmask(&omask); + maybe_close(new_udp_fd); maybe_close(accepted_fd); continue; /* -> check next fd in fd set */ } @@ -1298,17 +1299,18 @@ int inetd_main(int argc UNUSED_PARAM, char **argv) bb_perror_msg("vfork"+1); sleep(1); restore_sigmask(&omask); + maybe_close(new_udp_fd); maybe_close(accepted_fd); continue; /* -> check next fd in fd set */ } if (pid == 0) pid--; /* -1: "we did fork and we are child" */ } - /* if pid == 0 here, we never forked */ + /* if pid == 0 here, we didn't fork */ if (pid > 0) { /* parent */ if (sep->se_wait) { - /* tcp wait: we passed listening socket to child, + /* wait: we passed socket to child, * will wait for child to terminate */ sep->se_wait = pid; remove_fd_from_set(sep->se_fd); @@ -1345,9 +1347,13 @@ int inetd_main(int argc UNUSED_PARAM, char **argv) setsid(); /* "nowait" udp */ if (new_udp_fd >= 0) { - len_and_sockaddr *lsa = xzalloc_lsa(sep->se_family); + len_and_sockaddr *lsa; + int r; + + close(new_udp_fd); + lsa = xzalloc_lsa(sep->se_family); /* peek at the packet and remember peer addr */ - int r = recvfrom(ctrl, NULL, 0, MSG_PEEK|MSG_DONTWAIT, + r = recvfrom(ctrl, NULL, 0, MSG_PEEK|MSG_DONTWAIT, &lsa->u.sa, &lsa->len); if (r < 0) goto do_exit1; diff --git a/networking/tftp.c b/networking/tftp.c index 17485a527..043b879af 100644 --- a/networking/tftp.c +++ b/networking/tftp.c @@ -813,7 +813,8 @@ int tftpd_main(int argc UNUSED_PARAM, char **argv) goto err; } mode = local_file + strlen(local_file) + 1; - if (mode >= block_buf + result || strcmp(mode, "octet") != 0) { + /* RFC 1350 says mode string is case independent */ + if (mode >= block_buf + result || strcasecmp(mode, "octet") != 0) { goto err; } # if ENABLE_FEATURE_TFTP_BLOCKSIZE diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 2f0ca6ac5..fc380d9f9 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -278,7 +278,7 @@ static void parse_syslogdcfg(const char *file) parser_t *parser; parser = config_open2(file ? file : "/etc/syslog.conf", - file ? xfopen_for_read : fopen_or_warn_stdin); + file ? xfopen_for_read : fopen_for_read); if (!parser) /* didn't find default /etc/syslog.conf */ /* proceed as if we built busybox without config support */ @@ -594,6 +594,14 @@ static void log_locally(time_t now, char *msg, logFile_t *log_file) } /* newFile == "f.0" now */ rename(log_file->path, newFile); + /* Incredibly, if F and F.0 are hardlinks, POSIX + * _demands_ that rename returns 0 but does not + * remove F!!! + * (hardlinked F/F.0 pair was observed after + * power failure during rename()). + * Ensure old file is gone: + */ + unlink(log_file->path); #ifdef SYSLOGD_WRLOCK fl.l_type = F_UNLCK; fcntl(log_file->fd, F_SETLKW, &fl); @@ -678,7 +686,7 @@ static void timestamp_and_log(int pri, char *msg, int len) if (LOG_PRI(pri) < G.logLevel) { #if ENABLE_FEATURE_IPC_SYSLOG if ((option_mask32 & OPT_circularlog) && G.shbuf) { - log_to_shmem(msg); + log_to_shmem(G.printbuf); return; } #endif diff --git a/testsuite/tail.tests b/testsuite/tail.tests index 7140da262..305a83b15 100755 --- a/testsuite/tail.tests +++ b/testsuite/tail.tests @@ -14,4 +14,12 @@ testing "tail: +N with N > file length" \ "0\n" \ "" "qw" +testing "tail: -c +N with largish N" \ + " + dd if=/dev/zero bs=16k count=1 2>/dev/null | tail -c +8200 | wc -c; + dd if=/dev/zero bs=16k count=1 2>/dev/null | tail -c +8208 | wc -c; + " \ + "8185\n8177\n" \ + "" "" + exit $FAILCOUNT -- cgit v1.2.3-55-g6feb From f99811908419608e3ab81393d0177cc456101e4b Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sat, 4 Feb 2012 19:55:27 +0100 Subject: Apply post-1.19.3 patches, bump version to 1.19.4 Signed-off-by: Denys Vlasenko --- Makefile | 2 +- loginutils/getty.c | 2 ++ modutils/modinfo.c | 1 + networking/wget.c | 6 ++++-- util-linux/mdev.c | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 9648c9c20..da0b04cc4 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 19 -SUBLEVEL = 3 +SUBLEVEL = 4 EXTRAVERSION = NAME = Unnamed diff --git a/loginutils/getty.c b/loginutils/getty.c index 62456651b..4c8dd91a2 100644 --- a/loginutils/getty.c +++ b/loginutils/getty.c @@ -271,7 +271,9 @@ static void termios_init(int speed) #ifdef CMSPAR | CMSPAR /* mark or space parity */ #endif +#ifdef CBAUD | CBAUD /* (output) baud rate */ +#endif #ifdef CBAUDEX | CBAUDEX /* (output) baud rate */ #endif diff --git a/modutils/modinfo.c b/modutils/modinfo.c index 410b6fbe4..c0910ffed 100644 --- a/modutils/modinfo.c +++ b/modutils/modinfo.c @@ -13,6 +13,7 @@ //config:config MODINFO //config: bool "modinfo" //config: default y +//config: select PLATFORM_LINUX //config: help //config: Show information about a Linux Kernel module diff --git a/networking/wget.c b/networking/wget.c index 6443705fd..fbb8a2e12 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -552,6 +552,7 @@ static void download_one_url(const char *url) FILE *dfp; /* socket to ftp server (data) */ char *proxy = NULL; char *fname_out_alloc; + char *redirected_path = NULL; struct host_info server; struct host_info target; @@ -794,8 +795,8 @@ However, in real world it was observed that some web servers bb_error_msg_and_die("too many redirections"); fclose(sfp); if (str[0] == '/') { - free(target.allocated); - target.path = target.allocated = xstrdup(str+1); + free(redirected_path); + target.path = redirected_path = xstrdup(str+1); /* lsa stays the same: it's on the same server */ } else { parse_url(str, &target); @@ -850,6 +851,7 @@ However, in real world it was observed that some web servers free(server.allocated); free(target.allocated); free(fname_out_alloc); + free(redirected_path); } int wget_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; diff --git a/util-linux/mdev.c b/util-linux/mdev.c index 7cabb1df6..e0a527e73 100644 --- a/util-linux/mdev.c +++ b/util-linux/mdev.c @@ -610,7 +610,7 @@ int mdev_main(int argc UNUSED_PARAM, char **argv) int seqlen; char seqbuf[sizeof(int)*3 + 2]; - seqlen = open_read_close("mdev.seq", seqbuf, sizeof(seqbuf-1)); + seqlen = open_read_close("mdev.seq", seqbuf, sizeof(seqbuf) - 1); if (seqlen < 0) { seq = NULL; break; -- cgit v1.2.3-55-g6feb