diff options
author | Ron Yorston <rmy@pobox.com> | 2023-02-13 10:01:35 +0000 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2023-02-13 10:01:35 +0000 |
commit | 4e5fb4341fddc2b99e815f27ac577d85a57994c2 (patch) | |
tree | c9e2eae6d2752d7e7f907ad39e3797b0fd5c3e02 | |
parent | 0f2feac4b7e518e838b80d7b8ceac8f9699ae997 (diff) | |
parent | 93ae7464e6e460f25b73e4ffefd2d9a6499eae30 (diff) | |
download | busybox-w32-4e5fb4341fddc2b99e815f27ac577d85a57994c2.tar.gz busybox-w32-4e5fb4341fddc2b99e815f27ac577d85a57994c2.tar.bz2 busybox-w32-4e5fb4341fddc2b99e815f27ac577d85a57994c2.zip |
Merge branch 'busybox' into merge
-rw-r--r-- | editors/ed.c | 2 | ||||
-rw-r--r-- | libbb/lineedit.c | 17 | ||||
-rw-r--r-- | networking/ntpd.c | 36 | ||||
-rw-r--r-- | procps/nmeter.c | 9 | ||||
-rw-r--r-- | shell/ash.c | 3 | ||||
-rw-r--r-- | shell/hush.c | 51 |
6 files changed, 77 insertions, 41 deletions
diff --git a/editors/ed.c b/editors/ed.c index 209ce9942..4a84f7433 100644 --- a/editors/ed.c +++ b/editors/ed.c | |||
@@ -720,7 +720,7 @@ static void subCommand(const char *cmd, int num1, int num2) | |||
720 | if (deltaLen <= 0) { | 720 | if (deltaLen <= 0) { |
721 | memcpy(&lp->data[offset], newStr, newLen); | 721 | memcpy(&lp->data[offset], newStr, newLen); |
722 | if (deltaLen) { | 722 | if (deltaLen) { |
723 | memcpy(&lp->data[offset + newLen], | 723 | memmove(&lp->data[offset + newLen], |
724 | &lp->data[offset + oldLen], | 724 | &lp->data[offset + oldLen], |
725 | lp->len - offset - oldLen); | 725 | lp->len - offset - oldLen); |
726 | 726 | ||
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index bee423553..c4f0c65f1 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
@@ -2300,7 +2300,8 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | |||
2300 | * "\xff\n",pause,"ls\n" invalid and thus won't lose "ls". | 2300 | * "\xff\n",pause,"ls\n" invalid and thus won't lose "ls". |
2301 | * | 2301 | * |
2302 | * If LI_INTERRUPTIBLE, return -1 if got EINTR in poll() | 2302 | * If LI_INTERRUPTIBLE, return -1 if got EINTR in poll() |
2303 | * inside read_key, or if bb_got_signal != 0 (IOW: if signal | 2303 | * inside read_key and bb_got_signal became != 0, |
2304 | * or if bb_got_signal != 0 (IOW: if signal | ||
2304 | * arrived before poll() is reached). | 2305 | * arrived before poll() is reached). |
2305 | * | 2306 | * |
2306 | * Note: read_key sets errno to 0 on success. | 2307 | * Note: read_key sets errno to 0 on success. |
@@ -2317,14 +2318,16 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | |||
2317 | IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 0;) | 2318 | IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 0;) |
2318 | if (errno != EINTR) | 2319 | if (errno != EINTR) |
2319 | break; | 2320 | break; |
2321 | /* It was EINTR. Repeat read_key() unless... */ | ||
2320 | if (state->flags & LI_INTERRUPTIBLE) { | 2322 | if (state->flags & LI_INTERRUPTIBLE) { |
2321 | /* LI_INTERRUPTIBLE bails out on EINTR, | 2323 | /* LI_INTERRUPTIBLE bails out on EINTR |
2322 | * but nothing really guarantees that bb_got_signal | 2324 | * if bb_got_signal became nonzero. |
2323 | * is nonzero. Follow the least surprise principle: | 2325 | * (It may stay zero: for example, our SIGWINCH |
2326 | * handler does not set it. This is used for signals | ||
2327 | * which should not interrupt line editing). | ||
2324 | */ | 2328 | */ |
2325 | if (bb_got_signal == 0) | 2329 | if (bb_got_signal != 0) |
2326 | bb_got_signal = 255; | 2330 | goto ret; /* will return -1 */ |
2327 | goto ret; | ||
2328 | } | 2331 | } |
2329 | } | 2332 | } |
2330 | 2333 | ||
diff --git a/networking/ntpd.c b/networking/ntpd.c index 204e1d7c2..c7519b8fb 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
@@ -551,20 +551,21 @@ gettime1900d(void) | |||
551 | return G.cur_time; | 551 | return G.cur_time; |
552 | } | 552 | } |
553 | 553 | ||
554 | static void | ||
555 | d_to_tv(struct timeval *tv, double d) | ||
556 | { | ||
557 | tv->tv_sec = (long)d; | ||
558 | tv->tv_usec = (d - tv->tv_sec) * 1000000; | ||
559 | } | ||
560 | |||
561 | static NOINLINE double | 554 | static NOINLINE double |
562 | lfp_to_d(l_fixedpt_t lfp) | 555 | lfp_to_d(l_fixedpt_t lfp) |
563 | { | 556 | { |
564 | double ret; | 557 | double ret; |
565 | lfp.int_partl = ntohl(lfp.int_partl); | 558 | lfp.int_partl = ntohl(lfp.int_partl); |
566 | lfp.fractionl = ntohl(lfp.fractionl); | 559 | lfp.fractionl = ntohl(lfp.fractionl); |
567 | ret = (double)lfp.int_partl + ((double)lfp.fractionl / UINT_MAX); | 560 | ret = (double)lfp.int_partl + ((double)lfp.fractionl / (1ULL << 32)); |
561 | /* | ||
562 | * Shift timestamps before 1970 to the second NTP era (2036-2106): | ||
563 | * int_partl value of OFFSET_1900_1970 (2208988800) is interpreted as | ||
564 | * the start of year 1970 and it is the minimal representable time, | ||
565 | * all values form the sequence 2208988800..0xffffffff,0..2208988799. | ||
566 | */ | ||
567 | if (lfp.int_partl < OFFSET_1900_1970) | ||
568 | ret += (double)(1ULL << 32); /* because int_partl is 32-bit wide */ | ||
568 | return ret; | 569 | return ret; |
569 | } | 570 | } |
570 | static NOINLINE double | 571 | static NOINLINE double |
@@ -573,7 +574,7 @@ sfp_to_d(s_fixedpt_t sfp) | |||
573 | double ret; | 574 | double ret; |
574 | sfp.int_parts = ntohs(sfp.int_parts); | 575 | sfp.int_parts = ntohs(sfp.int_parts); |
575 | sfp.fractions = ntohs(sfp.fractions); | 576 | sfp.fractions = ntohs(sfp.fractions); |
576 | ret = (double)sfp.int_parts + ((double)sfp.fractions / USHRT_MAX); | 577 | ret = (double)sfp.int_parts + ((double)sfp.fractions / (1 << 16)); |
577 | return ret; | 578 | return ret; |
578 | } | 579 | } |
579 | #if ENABLE_FEATURE_NTPD_SERVER | 580 | #if ENABLE_FEATURE_NTPD_SERVER |
@@ -582,8 +583,8 @@ d_to_lfp(l_fixedpt_t *lfp, double d) | |||
582 | { | 583 | { |
583 | uint32_t intl; | 584 | uint32_t intl; |
584 | uint32_t frac; | 585 | uint32_t frac; |
585 | intl = (uint32_t)d; | 586 | intl = (uint32_t)(time_t)d; |
586 | frac = (uint32_t)((d - intl) * UINT_MAX); | 587 | frac = (uint32_t)((d - (time_t)d) * 0xffffffff); |
587 | lfp->int_partl = htonl(intl); | 588 | lfp->int_partl = htonl(intl); |
588 | lfp->fractionl = htonl(frac); | 589 | lfp->fractionl = htonl(frac); |
589 | } | 590 | } |
@@ -593,7 +594,7 @@ d_to_sfp(s_fixedpt_t *sfp, double d) | |||
593 | uint16_t ints; | 594 | uint16_t ints; |
594 | uint16_t frac; | 595 | uint16_t frac; |
595 | ints = (uint16_t)d; | 596 | ints = (uint16_t)d; |
596 | frac = (uint16_t)((d - ints) * USHRT_MAX); | 597 | frac = (uint16_t)((d - ints) * 0xffff); |
597 | sfp->int_parts = htons(ints); | 598 | sfp->int_parts = htons(ints); |
598 | sfp->fractions = htons(frac); | 599 | sfp->fractions = htons(frac); |
599 | } | 600 | } |
@@ -1036,8 +1037,17 @@ step_time(double offset) | |||
1036 | time_t tval; | 1037 | time_t tval; |
1037 | 1038 | ||
1038 | xgettimeofday(&tvc); | 1039 | xgettimeofday(&tvc); |
1040 | /* This code adds floating point value on the order of 1.0 | ||
1041 | * to a value of ~4 billion (as of years 203x). | ||
1042 | * With 52-bit mantissa, "only" 20 bits of offset's precision | ||
1043 | * are used (~1 microsecond), the rest is lost. | ||
1044 | * Some 200 billion years later, when tvc.tv_sec would have | ||
1045 | * 63 significant bits, the precision loss would be catastrophic, | ||
1046 | * a more complex code would be needed. | ||
1047 | */ | ||
1039 | dtime = tvc.tv_sec + (1.0e-6 * tvc.tv_usec) + offset; | 1048 | dtime = tvc.tv_sec + (1.0e-6 * tvc.tv_usec) + offset; |
1040 | d_to_tv(&tvn, dtime); | 1049 | tvn.tv_sec = (time_t)dtime; |
1050 | tvn.tv_usec = (dtime - tvn.tv_sec) * 1000000; | ||
1041 | xsettimeofday(&tvn); | 1051 | xsettimeofday(&tvn); |
1042 | 1052 | ||
1043 | VERB2 { | 1053 | VERB2 { |
diff --git a/procps/nmeter.c b/procps/nmeter.c index 68e6f3325..e52c868df 100644 --- a/procps/nmeter.c +++ b/procps/nmeter.c | |||
@@ -59,9 +59,9 @@ | |||
59 | 59 | ||
60 | typedef unsigned long long ullong; | 60 | typedef unsigned long long ullong; |
61 | 61 | ||
62 | enum { /* Preferably use powers of 2 */ | 62 | enum { |
63 | PROC_MIN_FILE_SIZE = 256, | 63 | PROC_MIN_FILE_SIZE = 256, |
64 | PROC_MAX_FILE_SIZE = 16 * 1024, | 64 | PROC_MAX_FILE_SIZE = 64 * 1024, /* 16k was a bit too small for a 128-CPU machine */ |
65 | }; | 65 | }; |
66 | 66 | ||
67 | typedef struct proc_file { | 67 | typedef struct proc_file { |
@@ -176,7 +176,10 @@ static void readfile_z(proc_file *pf, const char* fname) | |||
176 | close(fd); | 176 | close(fd); |
177 | if (rdsz > 0) { | 177 | if (rdsz > 0) { |
178 | if (rdsz == sz-1 && sz < PROC_MAX_FILE_SIZE) { | 178 | if (rdsz == sz-1 && sz < PROC_MAX_FILE_SIZE) { |
179 | sz *= 2; | 179 | if (sz < 4 * 1024) |
180 | sz *= 2; | ||
181 | else | ||
182 | sz += 4 * 1024; | ||
180 | buf = xrealloc(buf, sz); | 183 | buf = xrealloc(buf, sz); |
181 | goto again; | 184 | goto again; |
182 | } | 185 | } |
diff --git a/shell/ash.c b/shell/ash.c index 87190c453..94eb49d79 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -11769,7 +11769,8 @@ preadfd(void) | |||
11769 | again: | 11769 | again: |
11770 | /* For shell, LI_INTERRUPTIBLE is set: | 11770 | /* For shell, LI_INTERRUPTIBLE is set: |
11771 | * read_line_input will abort on either | 11771 | * read_line_input will abort on either |
11772 | * getting EINTR in poll(), or if it sees bb_got_signal != 0 | 11772 | * getting EINTR in poll() and bb_got_signal became != 0, |
11773 | * or if it sees bb_got_signal != 0 | ||
11773 | * (IOW: if signal arrives before poll() is reached). | 11774 | * (IOW: if signal arrives before poll() is reached). |
11774 | * Interactive testcases: | 11775 | * Interactive testcases: |
11775 | * (while kill -INT $$; do sleep 1; done) & | 11776 | * (while kill -INT $$; do sleep 1; done) & |
diff --git a/shell/hush.c b/shell/hush.c index d111f0cc5..e6be70078 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -1829,7 +1829,13 @@ static void restore_G_args(save_arg_t *sv, char **argv) | |||
1829 | * SIGQUIT: ignore | 1829 | * SIGQUIT: ignore |
1830 | * SIGTERM (interactive): ignore | 1830 | * SIGTERM (interactive): ignore |
1831 | * SIGHUP (interactive): | 1831 | * SIGHUP (interactive): |
1832 | * send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit | 1832 | * Send SIGCONT to stopped jobs, send SIGHUP to all jobs and exit. |
1833 | * Kernel would do this for us ("orphaned process group" handling | ||
1834 | * according to POSIX) if we are a session leader and thus our death | ||
1835 | * frees the controlling tty, but to be bash-compatible, we also do it | ||
1836 | * for every interactive shell's death by SIGHUP. | ||
1837 | * (Also, we need to restore tty pgrp, otherwise e.g. Midnight Commander | ||
1838 | * backgrounds when hush started from it gets killed by SIGHUP). | ||
1833 | * SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore | 1839 | * SIGTTIN, SIGTTOU, SIGTSTP (if job control is on): ignore |
1834 | * Note that ^Z is handled not by trapping SIGTSTP, but by seeing | 1840 | * Note that ^Z is handled not by trapping SIGTSTP, but by seeing |
1835 | * that all pipe members are stopped. Try this in bash: | 1841 | * that all pipe members are stopped. Try this in bash: |
@@ -1946,7 +1952,12 @@ static void record_pending_signo(int sig) | |||
1946 | { | 1952 | { |
1947 | sigaddset(&G.pending_set, sig); | 1953 | sigaddset(&G.pending_set, sig); |
1948 | #if ENABLE_FEATURE_EDITING | 1954 | #if ENABLE_FEATURE_EDITING |
1949 | bb_got_signal = sig; /* for read_line_input: "we got a signal" */ | 1955 | if (sig != SIGCHLD |
1956 | || (G_traps && G_traps[SIGCHLD] && G_traps[SIGCHLD][0]) | ||
1957 | /* ^^^ if SIGCHLD, interrupt line reading only if it has a trap */ | ||
1958 | ) { | ||
1959 | bb_got_signal = sig; /* for read_line_input: "we got a signal" */ | ||
1960 | } | ||
1950 | #endif | 1961 | #endif |
1951 | #if ENABLE_HUSH_FAST | 1962 | #if ENABLE_HUSH_FAST |
1952 | if (sig == SIGCHLD) { | 1963 | if (sig == SIGCHLD) { |
@@ -2173,20 +2184,27 @@ static int check_and_run_traps(void) | |||
2173 | break; | 2184 | break; |
2174 | #if ENABLE_HUSH_JOB | 2185 | #if ENABLE_HUSH_JOB |
2175 | case SIGHUP: { | 2186 | case SIGHUP: { |
2176 | //TODO: why are we doing this? ash and dash don't do this, | 2187 | /* if (G_interactive_fd) - no need to check, the handler |
2177 | //they have no handler for SIGHUP at all, | 2188 | * is only installed if we *are* interactive */ |
2178 | //they rely on kernel to send SIGHUP+SIGCONT to orphaned process groups | 2189 | { |
2179 | struct pipe *job; | 2190 | /* bash compat: "Before exiting, an interactive |
2180 | debug_printf_exec("%s: sig:%d default SIGHUP handler\n", __func__, sig); | 2191 | * shell resends the SIGHUP to all jobs, running |
2181 | /* bash is observed to signal whole process groups, | 2192 | * or stopped. Stopped jobs are sent SIGCONT |
2182 | * not individual processes */ | 2193 | * to ensure that they receive the SIGHUP." |
2183 | for (job = G.job_list; job; job = job->next) { | 2194 | */ |
2184 | if (job->pgrp <= 0) | 2195 | struct pipe *job; |
2185 | continue; | 2196 | debug_printf_exec("%s: sig:%d default SIGHUP handler\n", __func__, sig); |
2186 | debug_printf_exec("HUPing pgrp %d\n", job->pgrp); | 2197 | /* bash is observed to signal whole process groups, |
2187 | if (kill(- job->pgrp, SIGHUP) == 0) | 2198 | * not individual processes */ |
2188 | kill(- job->pgrp, SIGCONT); | 2199 | for (job = G.job_list; job; job = job->next) { |
2200 | if (job->pgrp <= 0) | ||
2201 | continue; | ||
2202 | debug_printf_exec("HUPing pgrp %d\n", job->pgrp); | ||
2203 | if (kill(- job->pgrp, SIGHUP) == 0) | ||
2204 | kill(- job->pgrp, SIGCONT); | ||
2205 | } | ||
2189 | } | 2206 | } |
2207 | /* this restores tty pgrp, then kills us with SIGHUP */ | ||
2190 | sigexit(SIGHUP); | 2208 | sigexit(SIGHUP); |
2191 | } | 2209 | } |
2192 | #endif | 2210 | #endif |
@@ -2669,7 +2687,8 @@ static int get_user_input(struct in_str *i) | |||
2669 | } else { | 2687 | } else { |
2670 | /* For shell, LI_INTERRUPTIBLE is set: | 2688 | /* For shell, LI_INTERRUPTIBLE is set: |
2671 | * read_line_input will abort on either | 2689 | * read_line_input will abort on either |
2672 | * getting EINTR in poll(), or if it sees bb_got_signal != 0 | 2690 | * getting EINTR in poll() and bb_got_signal became != 0, |
2691 | * or if it sees bb_got_signal != 0 | ||
2673 | * (IOW: if signal arrives before poll() is reached). | 2692 | * (IOW: if signal arrives before poll() is reached). |
2674 | * Interactive testcases: | 2693 | * Interactive testcases: |
2675 | * (while kill -INT $$; do sleep 1; done) & | 2694 | * (while kill -INT $$; do sleep 1; done) & |