diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-07 17:11:04 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2016-10-07 17:11:04 +0200 |
commit | 868530ade244bf8162fb6a10816bd815b166d509 (patch) | |
tree | 874fa8d8b979ae95ca53badadfa614f0de4ed7ac | |
parent | c3b34d8b39cae35fec8c6fb644d90dc80e574236 (diff) | |
download | busybox-w32-1_25_1.tar.gz busybox-w32-1_25_1.tar.bz2 busybox-w32-1_25_1.zip |
Apply post-1.25.0 patches, bump version to 1.25.11_25_1
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | archival/gzip.c | 5 | ||||
-rw-r--r-- | networking/libiproute/iproute.c | 3 | ||||
-rw-r--r-- | networking/ntpd.c | 7 | ||||
-rw-r--r-- | shell/hush.c | 88 |
5 files changed, 72 insertions, 33 deletions
@@ -1,6 +1,6 @@ | |||
1 | VERSION = 1 | 1 | VERSION = 1 |
2 | PATCHLEVEL = 25 | 2 | PATCHLEVEL = 25 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 1 |
4 | EXTRAVERSION = | 4 | EXTRAVERSION = |
5 | NAME = Unnamed | 5 | NAME = Unnamed |
6 | 6 | ||
diff --git a/archival/gzip.c b/archival/gzip.c index 8f1e4ff29..9e0bee815 100644 --- a/archival/gzip.c +++ b/archival/gzip.c | |||
@@ -2220,10 +2220,7 @@ int gzip_main(int argc UNUSED_PARAM, char **argv) | |||
2220 | opt >>= ENABLE_GUNZIP ? 7 : 5; /* drop cfv[dt]qn bits */ | 2220 | opt >>= ENABLE_GUNZIP ? 7 : 5; /* drop cfv[dt]qn bits */ |
2221 | if (opt == 0) | 2221 | if (opt == 0) |
2222 | opt = 1 << 6; /* default: 6 */ | 2222 | opt = 1 << 6; /* default: 6 */ |
2223 | /* Map 1..3 to 4 */ | 2223 | opt = ffs(opt >> 4); /* Maps -1..-4 to [0], -5 to [1] ... -9 to [5] */ |
2224 | if (opt & 0x7) | ||
2225 | opt |= 1 << 4; | ||
2226 | opt = ffs(opt >> 3); | ||
2227 | max_chain_length = 1 << gzip_level_config[opt].chain_shift; | 2224 | max_chain_length = 1 << gzip_level_config[opt].chain_shift; |
2228 | good_match = gzip_level_config[opt].good; | 2225 | good_match = gzip_level_config[opt].good; |
2229 | max_lazy_match = gzip_level_config[opt].lazy2 * 2; | 2226 | max_lazy_match = gzip_level_config[opt].lazy2 * 2; |
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c index e674e9a0d..48dc6e3d9 100644 --- a/networking/libiproute/iproute.c +++ b/networking/libiproute/iproute.c | |||
@@ -362,10 +362,9 @@ IF_FEATURE_IP_RULE(ARG_table,) | |||
362 | req.r.rtm_scope = RT_SCOPE_NOWHERE; | 362 | req.r.rtm_scope = RT_SCOPE_NOWHERE; |
363 | 363 | ||
364 | if (cmd != RTM_DELROUTE) { | 364 | if (cmd != RTM_DELROUTE) { |
365 | req.r.rtm_scope = RT_SCOPE_UNIVERSE; | ||
365 | if (RTPROT_BOOT != 0) | 366 | if (RTPROT_BOOT != 0) |
366 | req.r.rtm_protocol = RTPROT_BOOT; | 367 | req.r.rtm_protocol = RTPROT_BOOT; |
367 | if (RT_SCOPE_UNIVERSE != 0) | ||
368 | req.r.rtm_scope = RT_SCOPE_UNIVERSE; | ||
369 | if (RTN_UNICAST != 0) | 368 | if (RTN_UNICAST != 0) |
370 | req.r.rtm_type = RTN_UNICAST; | 369 | req.r.rtm_type = RTN_UNICAST; |
371 | } | 370 | } |
diff --git a/networking/ntpd.c b/networking/ntpd.c index 98158a304..1a3367be2 100644 --- a/networking/ntpd.c +++ b/networking/ntpd.c | |||
@@ -2051,6 +2051,13 @@ recv_and_process_client_pkt(void /*int fd*/) | |||
2051 | goto bail; | 2051 | goto bail; |
2052 | } | 2052 | } |
2053 | 2053 | ||
2054 | /* Respond only to client and symmetric active packets */ | ||
2055 | if ((msg.m_status & MODE_MASK) != MODE_CLIENT | ||
2056 | && (msg.m_status & MODE_MASK) != MODE_SYM_ACT | ||
2057 | ) { | ||
2058 | goto bail; | ||
2059 | } | ||
2060 | |||
2054 | query_status = msg.m_status; | 2061 | query_status = msg.m_status; |
2055 | query_xmttime = msg.m_xmttime; | 2062 | query_xmttime = msg.m_xmttime; |
2056 | 2063 | ||
diff --git a/shell/hush.c b/shell/hush.c index eabe83ac6..dfbbb4122 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -1477,19 +1477,50 @@ static sighandler_t install_sighandler(int sig, sighandler_t handler) | |||
1477 | return old_sa.sa_handler; | 1477 | return old_sa.sa_handler; |
1478 | } | 1478 | } |
1479 | 1479 | ||
1480 | static void hush_exit(int exitcode) NORETURN; | ||
1481 | static void fflush_and__exit(void) NORETURN; | ||
1482 | static void restore_ttypgrp_and__exit(void) NORETURN; | ||
1483 | |||
1484 | static void restore_ttypgrp_and__exit(void) | ||
1485 | { | ||
1486 | /* xfunc has failed! die die die */ | ||
1487 | /* no EXIT traps, this is an escape hatch! */ | ||
1488 | G.exiting = 1; | ||
1489 | hush_exit(xfunc_error_retval); | ||
1490 | } | ||
1491 | |||
1492 | /* Needed only on some libc: | ||
1493 | * It was observed that on exit(), fgetc'ed buffered data | ||
1494 | * gets "unwound" via lseek(fd, -NUM, SEEK_CUR). | ||
1495 | * With the net effect that even after fork(), not vfork(), | ||
1496 | * exit() in NOEXECed applet in "sh SCRIPT": | ||
1497 | * noexec_applet_here | ||
1498 | * echo END_OF_SCRIPT | ||
1499 | * lseeks fd in input FILE object from EOF to "e" in "echo END_OF_SCRIPT". | ||
1500 | * This makes "echo END_OF_SCRIPT" executed twice. | ||
1501 | * Similar problems can be seen with die_if_script() -> xfunc_die() | ||
1502 | * and in `cmd` handling. | ||
1503 | * If set as die_func(), this makes xfunc_die() exit via _exit(), not exit(): | ||
1504 | */ | ||
1505 | static void fflush_and__exit(void) | ||
1506 | { | ||
1507 | fflush_all(); | ||
1508 | _exit(xfunc_error_retval); | ||
1509 | } | ||
1510 | |||
1480 | #if ENABLE_HUSH_JOB | 1511 | #if ENABLE_HUSH_JOB |
1481 | 1512 | ||
1482 | static void xfunc_has_died(void); | ||
1483 | /* After [v]fork, in child: do not restore tty pgrp on xfunc death */ | 1513 | /* After [v]fork, in child: do not restore tty pgrp on xfunc death */ |
1484 | # define disable_restore_tty_pgrp_on_exit() (die_func = NULL) | 1514 | # define disable_restore_tty_pgrp_on_exit() (die_func = fflush_and__exit) |
1485 | /* After [v]fork, in parent: restore tty pgrp on xfunc death */ | 1515 | /* After [v]fork, in parent: restore tty pgrp on xfunc death */ |
1486 | # define enable_restore_tty_pgrp_on_exit() (die_func = xfunc_has_died) | 1516 | # define enable_restore_tty_pgrp_on_exit() (die_func = restore_ttypgrp_and__exit) |
1487 | 1517 | ||
1488 | /* Restores tty foreground process group, and exits. | 1518 | /* Restores tty foreground process group, and exits. |
1489 | * May be called as signal handler for fatal signal | 1519 | * May be called as signal handler for fatal signal |
1490 | * (will resend signal to itself, producing correct exit state) | 1520 | * (will resend signal to itself, producing correct exit state) |
1491 | * or called directly with -EXITCODE. | 1521 | * or called directly with -EXITCODE. |
1492 | * We also call it if xfunc is exiting. */ | 1522 | * We also call it if xfunc is exiting. |
1523 | */ | ||
1493 | static void sigexit(int sig) NORETURN; | 1524 | static void sigexit(int sig) NORETURN; |
1494 | static void sigexit(int sig) | 1525 | static void sigexit(int sig) |
1495 | { | 1526 | { |
@@ -1544,7 +1575,6 @@ static sighandler_t pick_sighandler(unsigned sig) | |||
1544 | } | 1575 | } |
1545 | 1576 | ||
1546 | /* Restores tty foreground process group, and exits. */ | 1577 | /* Restores tty foreground process group, and exits. */ |
1547 | static void hush_exit(int exitcode) NORETURN; | ||
1548 | static void hush_exit(int exitcode) | 1578 | static void hush_exit(int exitcode) |
1549 | { | 1579 | { |
1550 | #if ENABLE_FEATURE_EDITING_SAVE_ON_EXIT | 1580 | #if ENABLE_FEATURE_EDITING_SAVE_ON_EXIT |
@@ -1580,23 +1610,14 @@ static void hush_exit(int exitcode) | |||
1580 | } | 1610 | } |
1581 | #endif | 1611 | #endif |
1582 | 1612 | ||
1583 | #if ENABLE_HUSH_JOB | ||
1584 | fflush_all(); | 1613 | fflush_all(); |
1614 | #if ENABLE_HUSH_JOB | ||
1585 | sigexit(- (exitcode & 0xff)); | 1615 | sigexit(- (exitcode & 0xff)); |
1586 | #else | 1616 | #else |
1587 | exit(exitcode); | 1617 | _exit(exitcode); |
1588 | #endif | 1618 | #endif |
1589 | } | 1619 | } |
1590 | 1620 | ||
1591 | static void xfunc_has_died(void) NORETURN; | ||
1592 | static void xfunc_has_died(void) | ||
1593 | { | ||
1594 | /* xfunc has failed! die die die */ | ||
1595 | /* no EXIT traps, this is an escape hatch! */ | ||
1596 | G.exiting = 1; | ||
1597 | hush_exit(xfunc_error_retval); | ||
1598 | } | ||
1599 | |||
1600 | 1621 | ||
1601 | //TODO: return a mask of ALL handled sigs? | 1622 | //TODO: return a mask of ALL handled sigs? |
1602 | static int check_and_run_traps(void) | 1623 | static int check_and_run_traps(void) |
@@ -1766,6 +1787,7 @@ static int set_local_var(char *str, int flg_export, int local_lvl, int flg_read_ | |||
1766 | { | 1787 | { |
1767 | struct variable **var_pp; | 1788 | struct variable **var_pp; |
1768 | struct variable *cur; | 1789 | struct variable *cur; |
1790 | char *free_me = NULL; | ||
1769 | char *eq_sign; | 1791 | char *eq_sign; |
1770 | int name_len; | 1792 | int name_len; |
1771 | 1793 | ||
@@ -1782,6 +1804,7 @@ static int set_local_var(char *str, int flg_export, int local_lvl, int flg_read_ | |||
1782 | var_pp = &cur->next; | 1804 | var_pp = &cur->next; |
1783 | continue; | 1805 | continue; |
1784 | } | 1806 | } |
1807 | |||
1785 | /* We found an existing var with this name */ | 1808 | /* We found an existing var with this name */ |
1786 | if (cur->flg_read_only) { | 1809 | if (cur->flg_read_only) { |
1787 | #if !BB_MMU | 1810 | #if !BB_MMU |
@@ -1830,12 +1853,17 @@ static int set_local_var(char *str, int flg_export, int local_lvl, int flg_read_ | |||
1830 | strcpy(cur->varstr, str); | 1853 | strcpy(cur->varstr, str); |
1831 | goto free_and_exp; | 1854 | goto free_and_exp; |
1832 | } | 1855 | } |
1833 | } else { | 1856 | /* Can't reuse */ |
1834 | /* max_len == 0 signifies "malloced" var, which we can | 1857 | cur->max_len = 0; |
1835 | * (and has to) free */ | 1858 | goto set_str_and_exp; |
1836 | free(cur->varstr); | 1859 | } |
1837 | } | 1860 | /* max_len == 0 signifies "malloced" var, which we can |
1838 | cur->max_len = 0; | 1861 | * (and have to) free. But we can't free(cur->varstr) here: |
1862 | * if cur->flg_export is 1, it is in the environment. | ||
1863 | * We should either unsetenv+free, or wait until putenv, | ||
1864 | * then putenv(new)+free(old). | ||
1865 | */ | ||
1866 | free_me = cur->varstr; | ||
1839 | goto set_str_and_exp; | 1867 | goto set_str_and_exp; |
1840 | } | 1868 | } |
1841 | 1869 | ||
@@ -1862,10 +1890,15 @@ static int set_local_var(char *str, int flg_export, int local_lvl, int flg_read_ | |||
1862 | cur->flg_export = 0; | 1890 | cur->flg_export = 0; |
1863 | /* unsetenv was already done */ | 1891 | /* unsetenv was already done */ |
1864 | } else { | 1892 | } else { |
1893 | int i; | ||
1865 | debug_printf_env("%s: putenv '%s'\n", __func__, cur->varstr); | 1894 | debug_printf_env("%s: putenv '%s'\n", __func__, cur->varstr); |
1866 | return putenv(cur->varstr); | 1895 | i = putenv(cur->varstr); |
1896 | /* only now we can free old exported malloced string */ | ||
1897 | free(free_me); | ||
1898 | return i; | ||
1867 | } | 1899 | } |
1868 | } | 1900 | } |
1901 | free(free_me); | ||
1869 | return 0; | 1902 | return 0; |
1870 | } | 1903 | } |
1871 | 1904 | ||
@@ -5913,7 +5946,8 @@ static FILE *generate_stream_from_string(const char *s, pid_t *pid_p) | |||
5913 | ) { | 5946 | ) { |
5914 | static const char *const argv[] = { NULL, NULL }; | 5947 | static const char *const argv[] = { NULL, NULL }; |
5915 | builtin_trap((char**)argv); | 5948 | builtin_trap((char**)argv); |
5916 | exit(0); /* not _exit() - we need to fflush */ | 5949 | fflush_all(); /* important */ |
5950 | _exit(0); | ||
5917 | } | 5951 | } |
5918 | # if BB_MMU | 5952 | # if BB_MMU |
5919 | reset_traps_to_defaults(); | 5953 | reset_traps_to_defaults(); |
@@ -6466,7 +6500,8 @@ static void dump_cmd_in_x_mode(char **argv) | |||
6466 | * Never returns. | 6500 | * Never returns. |
6467 | * Don't exit() here. If you don't exec, use _exit instead. | 6501 | * Don't exit() here. If you don't exec, use _exit instead. |
6468 | * The at_exit handlers apparently confuse the calling process, | 6502 | * The at_exit handlers apparently confuse the calling process, |
6469 | * in particular stdin handling. Not sure why? -- because of vfork! (vda) */ | 6503 | * in particular stdin handling. Not sure why? -- because of vfork! (vda) |
6504 | */ | ||
6470 | static void pseudo_exec_argv(nommu_save_t *nommu_save, | 6505 | static void pseudo_exec_argv(nommu_save_t *nommu_save, |
6471 | char **argv, int assignment_cnt, | 6506 | char **argv, int assignment_cnt, |
6472 | char **argv_expanded) NORETURN; | 6507 | char **argv_expanded) NORETURN; |
@@ -7787,6 +7822,7 @@ int hush_main(int argc, char **argv) | |||
7787 | INIT_G(); | 7822 | INIT_G(); |
7788 | if (EXIT_SUCCESS != 0) /* if EXIT_SUCCESS == 0, it is already done */ | 7823 | if (EXIT_SUCCESS != 0) /* if EXIT_SUCCESS == 0, it is already done */ |
7789 | G.last_exitcode = EXIT_SUCCESS; | 7824 | G.last_exitcode = EXIT_SUCCESS; |
7825 | |||
7790 | #if ENABLE_HUSH_FAST | 7826 | #if ENABLE_HUSH_FAST |
7791 | G.count_SIGCHLD++; /* ensure it is != G.handled_SIGCHLD */ | 7827 | G.count_SIGCHLD++; /* ensure it is != G.handled_SIGCHLD */ |
7792 | #endif | 7828 | #endif |
@@ -7876,7 +7912,7 @@ int hush_main(int argc, char **argv) | |||
7876 | /* Initialize some more globals to non-zero values */ | 7912 | /* Initialize some more globals to non-zero values */ |
7877 | cmdedit_update_prompt(); | 7913 | cmdedit_update_prompt(); |
7878 | 7914 | ||
7879 | die_func = xfunc_has_died; | 7915 | die_func = restore_ttypgrp_and__exit; |
7880 | 7916 | ||
7881 | /* Shell is non-interactive at first. We need to call | 7917 | /* Shell is non-interactive at first. We need to call |
7882 | * install_special_sighandlers() if we are going to execute "sh <script>", | 7918 | * install_special_sighandlers() if we are going to execute "sh <script>", |