diff --git a/backport-generalize-const-trick.patch b/backport-generalize-const-trick.patch new file mode 100644 index 0000000000000000000000000000000000000000..b837a2e91c9ecd158bc02bcf0449bbd56ff75824 --- /dev/null +++ b/backport-generalize-const-trick.patch @@ -0,0 +1,212 @@ +commit 1f925038ab9c6bd8f6b3cd40ed7aab0ef10d898e +Author: YU Jincheng +Date: Wed Sep 29 17:37:26 2021 +0800 + + *: generalize "const trick" + + While at it, change all "__asm__" to "asm" + + Co-authored-by: canyie <31466456+canyie@users.noreply.github.com> + Signed-off-by: YU Jincheng + Signed-off-by: Denys Vlasenko + +diff --git a/coreutils/test.c b/coreutils/test.c +index 7c65743..fc95672 100644 +--- a/coreutils/test.c ++++ b/coreutils/test.c +@@ -435,7 +435,7 @@ struct test_statics { + }; + + /* See test_ptr_hack.c */ +-extern struct test_statics *const test_ptr_to_statics; ++extern struct test_statics *BB_GLOBAL_CONST test_ptr_to_statics; + + #define S (*test_ptr_to_statics) + #define args (S.args ) +@@ -446,8 +446,7 @@ extern struct test_statics *const test_ptr_to_statics; + #define leaving (S.leaving ) + + #define INIT_S() do { \ +- (*(struct test_statics**)not_const_pp(&test_ptr_to_statics)) = xzalloc(sizeof(S)); \ +- barrier(); \ ++ ASSIGN_CONST_PTR(test_ptr_to_statics, xzalloc(sizeof(S))); \ + } while (0) + #define DEINIT_S() do { \ + free(group_array); \ +diff --git a/include/libbb.h b/include/libbb.h +index dfcaa05..02cc008 100644 +--- a/include/libbb.h ++++ b/include/libbb.h +@@ -365,13 +365,27 @@ struct BUG_off_t_size_is_misdetected { + #endif + #endif + ++/* We use a trick to have more optimized code (fewer pointer reloads ++ * and reduced binary size by a few kilobytes) like: ++ * ash.c: extern struct globals *const ash_ptr_to_globals; ++ * ash_ptr_hack.c: struct globals *ash_ptr_to_globals; ++ * This way, compiler in ash.c knows the pointer can not change. ++ * ++ * However, this may break on weird arches or toolchains. In this case, ++ * set "-DBB_GLOBAL_CONST=''" in CONFIG_EXTRA_CFLAGS to disable ++ * this optimization. ++ */ ++#ifndef BB_GLOBAL_CONST ++# define BB_GLOBAL_CONST const ++#endif ++ + #if defined(errno) + /* If errno is a define, assume it's "define errno (*__errno_location())" + * and we will cache it's result in this variable */ +-extern int *const bb_errno; +-#undef errno +-#define errno (*bb_errno) +-#define bb_cached_errno_ptr 1 ++extern int *BB_GLOBAL_CONST bb_errno; ++# undef errno ++# define errno (*bb_errno) ++# define bb_cached_errno_ptr 1 + #endif + + #if !(ULONG_MAX > 0xffffffff) +@@ -2270,6 +2284,8 @@ struct globals; + * If you want to assign a value, use SET_PTR_TO_GLOBALS(x) */ + extern struct globals *const ptr_to_globals; + ++#define barrier() asm volatile ("":::"memory") ++ + #if defined(__clang_major__) && __clang_major__ >= 9 + /* Clang/llvm drops assignment to "constant" storage. Silently. + * Needs serious convincing to not eliminate the store. +@@ -2277,7 +2293,7 @@ extern struct globals *const ptr_to_globals; + static ALWAYS_INLINE void* not_const_pp(const void *p) + { + void *pp; +- __asm__ __volatile__( ++ asm volatile ( + "# forget that p points to const" + : /*outputs*/ "=r" (pp) + : /*inputs*/ "0" (p) +@@ -2288,13 +2304,13 @@ static ALWAYS_INLINE void* not_const_pp(const void *p) + static ALWAYS_INLINE void* not_const_pp(const void *p) { return (void*)p; } + #endif + +-/* At least gcc 3.4.6 on mipsel system needs optimization barrier */ +-#define barrier() __asm__ __volatile__("":::"memory") +-#define SET_PTR_TO_GLOBALS(x) do { \ +- (*(struct globals**)not_const_pp(&ptr_to_globals)) = (void*)(x); \ ++#define ASSIGN_CONST_PTR(p, v) do { \ ++ *(void**)not_const_pp(&p) = (void*)(v); \ ++ /* At least gcc 3.4.6 on mipsel needs optimization barrier */ \ + barrier(); \ + } while (0) + ++#define SET_PTR_TO_GLOBALS(x) ASSIGN_CONST_PTR(ptr_to_globals, x) + #define FREE_PTR_TO_GLOBALS() do { \ + if (ENABLE_FEATURE_CLEAN_UP) { \ + free(ptr_to_globals); \ +diff --git a/libbb/appletlib.c b/libbb/appletlib.c +index 5c5d7eb..bf26c99 100644 +--- a/libbb/appletlib.c ++++ b/libbb/appletlib.c +@@ -247,8 +247,7 @@ void lbb_prepare(const char *applet + IF_FEATURE_INDIVIDUAL(, char **argv)) + { + #ifdef bb_cached_errno_ptr +- (*(int **)not_const_pp(&bb_errno)) = get_perrno(); +- barrier(); ++ ASSIGN_CONST_PTR(bb_errno, get_perrno()); + #endif + applet_name = applet; + +diff --git a/libbb/lineedit.c b/libbb/lineedit.c +index a7a3ee1..3c87abc 100644 +--- a/libbb/lineedit.c ++++ b/libbb/lineedit.c +@@ -192,7 +192,7 @@ struct lineedit_statics { + }; + + /* See lineedit_ptr_hack.c */ +-extern struct lineedit_statics *const lineedit_ptr_to_statics; ++extern struct lineedit_statics *BB_GLOBAL_CONST lineedit_ptr_to_statics; + + #define S (*lineedit_ptr_to_statics) + #define state (S.state ) +@@ -214,8 +214,7 @@ extern struct lineedit_statics *const lineedit_ptr_to_statics; + #define delbuf (S.delbuf ) + + #define INIT_S() do { \ +- (*(struct lineedit_statics**)not_const_pp(&lineedit_ptr_to_statics)) = xzalloc(sizeof(S)); \ +- barrier(); \ ++ ASSIGN_CONST_PTR(lineedit_ptr_to_statics, xzalloc(sizeof(S))); \ + } while (0) + + static void deinit_S(void) +diff --git a/procps/powertop.c b/procps/powertop.c +index fc6018b..24c2b32 100644 +--- a/procps/powertop.c ++++ b/procps/powertop.c +@@ -505,7 +505,7 @@ static void cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, + unsigned int *edx) + { + /* EAX value specifies what information to return */ +- __asm__( ++ asm ( + " pushl %%ebx\n" /* Save EBX */ + " cpuid\n" + " movl %%ebx, %1\n" /* Save content of EBX */ +diff --git a/shell/ash.c b/shell/ash.c +index 4bf0615..7b85981 100644 +--- a/shell/ash.c ++++ b/shell/ash.c +@@ -303,20 +303,6 @@ typedef long arith_t; + # error "Do not even bother, ash will not run on NOMMU machine" + #endif + +-/* We use a trick to have more optimized code (fewer pointer reloads): +- * ash.c: extern struct globals *const ash_ptr_to_globals; +- * ash_ptr_hack.c: struct globals *ash_ptr_to_globals; +- * This way, compiler in ash.c knows the pointer can not change. +- * +- * However, this may break on weird arches or toolchains. In this case, +- * set "-DBB_GLOBAL_CONST=''" in CONFIG_EXTRA_CFLAGS to disable +- * this optimization. +- */ +-#ifndef BB_GLOBAL_CONST +-# define BB_GLOBAL_CONST const +-#endif +- +- + /* ============ Hash table sizes. Configurable. */ + + #define VTABSIZE 39 +@@ -518,8 +504,7 @@ extern struct globals_misc *BB_GLOBAL_CONST ash_ptr_to_globals_misc; + #define random_gen (G_misc.random_gen ) + #define backgndpid (G_misc.backgndpid ) + #define INIT_G_misc() do { \ +- (*(struct globals_misc**)not_const_pp(&ash_ptr_to_globals_misc)) = xzalloc(sizeof(G_misc)); \ +- barrier(); \ ++ ASSIGN_CONST_PTR(ash_ptr_to_globals_misc, xzalloc(sizeof(G_misc))); \ + savestatus = -1; \ + curdir = nullstr; \ + physdir = nullstr; \ +@@ -1597,8 +1582,7 @@ extern struct globals_memstack *BB_GLOBAL_CONST ash_ptr_to_globals_memstack; + #define g_stacknleft (G_memstack.g_stacknleft) + #define stackbase (G_memstack.stackbase ) + #define INIT_G_memstack() do { \ +- (*(struct globals_memstack**)not_const_pp(&ash_ptr_to_globals_memstack)) = xzalloc(sizeof(G_memstack)); \ +- barrier(); \ ++ ASSIGN_CONST_PTR(ash_ptr_to_globals_memstack, xzalloc(sizeof(G_memstack))); \ + g_stackp = &stackbase; \ + g_stacknxt = stackbase.space; \ + g_stacknleft = MINSIZE; \ +@@ -2229,8 +2213,7 @@ extern struct globals_var *BB_GLOBAL_CONST ash_ptr_to_globals_var; + #endif + #define INIT_G_var() do { \ + unsigned i; \ +- (*(struct globals_var**)not_const_pp(&ash_ptr_to_globals_var)) = xzalloc(sizeof(G_var)); \ +- barrier(); \ ++ ASSIGN_CONST_PTR(ash_ptr_to_globals_var, xzalloc(sizeof(G_var))); \ + for (i = 0; i < ARRAY_SIZE(varinit_data); i++) { \ + varinit[i].flags = varinit_data[i].flags; \ + varinit[i].var_text = varinit_data[i].var_text; \ diff --git a/busybox.spec b/busybox.spec index c00e32b1335ba4fbad594945675aa014c11dceb4..7cc53e26267ad409e47798c4d2887105d5c64cde 100644 --- a/busybox.spec +++ b/busybox.spec @@ -4,7 +4,7 @@ %endif %if "%{!?RELEASE:1}" -%define RELEASE 18 +%define RELEASE 19 %endif Epoch: 1 @@ -23,6 +23,7 @@ Source3: busybox-dynamic.config Patch6000: backport-CVE-2022-28391.patch Patch6001: backport-CVE-2022-30065.patch Patch6002: backport-fix-use-after-free-in-bc-module.patch +Patch6003: backport-generalize-const-trick.patch BuildRoot: %_topdir/BUILDROOT #Dependency @@ -98,6 +99,9 @@ install -m 644 docs/busybox.dynamic.1 $RPM_BUILD_ROOT/%{_mandir}/man1/busybox.1 %{_mandir}/man1/busybox.petitboot.1.gz %changelog +* Fri Dec 16 2022 cf_zhao - 1:1.34.1-19 +- Backport generalize "const trick" which commited in 1f925038ab9c6bd8f6b3cd40ed7aab0ef10d898e + * Fri Oct 28 2022 jikui - 1:1.34.1-18 - fix use after free in bc module