busybox: Avoid race building libbb

When building busybox, an occasional error was observed.
The error is consistently the same:

libbb/appletlib.c:164:13: error: 'NUM_APPLETS' undeclared (first use in this function)
  while (i < NUM_APPLETS) {

The reason is the include file where NUM_APPLETS is defined is not yet generated (or is being modified)
at the time libbb/appletlib.c is compiled.
The attached patchset fixes the problem by assuring libb is compiled as the last directory.

[YOCTO#10116]

(From OE-Core rev: a866a05e2c7d090a77aa6e95339c93e3592703a6)

Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Juro Bystricky 2016-09-14 10:05:46 -07:00 committed by Richard Purdie
parent de915fb7d3
commit a6f0bced4c
5 changed files with 151 additions and 66 deletions

View File

@ -0,0 +1,53 @@
Upstream-Status: Backport
Patch addressing a parallel make race in Busybox
http://git.busybox.net/busybox/commit/?id=d8e61bbf13d0cf38d477255cfd5dc71c5d51d575
Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
From d8e61bbf13d0cf38d477255cfd5dc71c5d51d575 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Sun, 21 Aug 2016 22:00:20 +0200
Subject: build system: different fix for
include/applet_tables.h/include/NUM_APPLETS.h
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/applets/Kbuild.src b/applets/Kbuild.src
index 5cc1827..3aedbbf 100644
--- a/applets/Kbuild.src
+++ b/applets/Kbuild.src
@@ -29,7 +29,7 @@ applets/applets.o: include/usage_compressed.h include/applet_tables.h
applets/applet_tables: .config include/applets.h
applets/usage: .config include/applets.h
-applets/usage_pod: .config include/applets.h include/applet_tables.h include/NUM_APPLETS.h
+applets/usage_pod: .config include/applets.h include/applet_tables.h
quiet_cmd_gen_usage_compressed = GEN include/usage_compressed.h
cmd_gen_usage_compressed = $(srctree_slash)applets/usage_compressed include/usage_compressed.h applets
@@ -37,8 +37,21 @@ quiet_cmd_gen_usage_compressed = GEN include/usage_compressed.h
include/usage_compressed.h: applets/usage $(srctree_slash)applets/usage_compressed
$(call cmd,gen_usage_compressed)
-quiet_cmd_gen_applet_tables = GEN include/applet_tables.h
+quiet_cmd_gen_applet_tables = GEN include/applet_tables.h include/NUM_APPLETS.h
cmd_gen_applet_tables = applets/applet_tables include/applet_tables.h include/NUM_APPLETS.h
-include/applet_tables.h include/NUM_APPLETS.h: applets/applet_tables
+include/NUM_APPLETS.h: applets/applet_tables
+ $(call cmd,gen_applet_tables)
+
+# In fact, include/applet_tables.h depends only on applets/applet_tables,
+# and is generated by it. But specifying only it can run
+# applets/applet_tables twice, possibly in parallel.
+# We say that it also needs NUM_APPLETS.h
+#
+# Unfortunately, we need to list the same command,
+# and it can be executed twice (sequentially).
+# The alternative is to not list any command,
+# and then if include/applet_tables.h is deleted, it won't be rebuilt.
+#
+include/applet_tables.h: include/NUM_APPLETS.h applets/applet_tables
$(call cmd,gen_applet_tables)

View File

@ -0,0 +1,61 @@
Upstream-Status: Backport
Patch addressing a parallel make race in Busybox
http://git.busybox.net/busybox/commit/?id=0dddbc1a59795a77679d8c5ef48a2795cb470563
Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
From 0dddbc1a59795a77679d8c5ef48a2795cb470563 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <vda.linux@googlemail.com>
Date: Tue, 23 Aug 2016 20:21:36 +0200
Subject: build system: always rewrite NUM_APPLETS.h
Conditional rewrite can keep NUM_APPLETS.h mtime old,
this causes make to try to regenerate it at every invocation.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/applets/applet_tables.c b/applets/applet_tables.c
index 8401a15..ef911a4 100644
--- a/applets/applet_tables.c
+++ b/applets/applet_tables.c
@@ -192,27 +192,28 @@ int main(int argc, char **argv)
printf("};\n");
#endif
//printf("#endif /* SKIP_definitions */\n");
+
// printf("\n");
// printf("#define MAX_APPLET_NAME_LEN %u\n", MAX_APPLET_NAME_LEN);
if (argv[2]) {
- char line_old[80];
- char line_new[80];
FILE *fp;
+ char line_new[80];
+// char line_old[80];
- line_old[0] = 0;
- fp = fopen(argv[2], "r");
- if (fp) {
- fgets(line_old, sizeof(line_old), fp);
- fclose(fp);
- }
sprintf(line_new, "#define NUM_APPLETS %u\n", NUM_APPLETS);
- if (strcmp(line_old, line_new) != 0) {
+// line_old[0] = 0;
+// fp = fopen(argv[2], "r");
+// if (fp) {
+// fgets(line_old, sizeof(line_old), fp);
+// fclose(fp);
+// }
+// if (strcmp(line_old, line_new) != 0) {
fp = fopen(argv[2], "w");
if (!fp)
return 1;
fputs(line_new, fp);
- }
+// }
}
return 0;

View File

@ -0,0 +1,34 @@
There is a potential race when building libbb, as some header files
needed by libbb are not generated yet (or are being modified) at the time
libbb is compiled.
This patch avoids this scenario by building libbb as the last directory.
Upstream-Status: Submitted
Signed-off-by: Juro Bystricky <juro.bystricky@intel.com>
Index: busybox-1.24.1/Makefile
===================================================================
diff --git a/Makefile b/Makefile
index 5cfc763..69f3831 100644
--- a/Makefile
+++ b/Makefile
@@ -738,9 +738,18 @@ $(sort $(busybox-all)): $(busybox-dirs) ;
# Error messages still appears in the original language
PHONY += $(busybox-dirs)
-$(busybox-dirs): prepare scripts
+
+libbb-dir = $(filter libbb,$(busybox-dirs))
+busybox-dirs1 = $(filter-out libbb,$(busybox-dirs))
+
+$(busybox-dirs1): prepare scripts
$(Q)$(MAKE) $(build)=$@
+ifneq ($(libbb-dir),)
+$(libbb-dir): | $(busybox-dirs1)
+ $(Q)$(MAKE) $(build)=$@
+endif
+
# Build the kernel release string
# The KERNELRELEASE is stored in a file named .kernelrelease
# to be used when executing for example make install or make modules_install

View File

@ -1,65 +0,0 @@
When applet_tables is run, we need it to touch both output files,
else make will keep calling the command, potentially leading to races
as the files are potentially rewritten.
We also need to ensure that applet_tables is called once, not twice,
potentially in parallel. To do this, make one file depend upon the other.
Upstream-Status: Submitted
RP 2016/8/19
Index: busybox-1.24.1/applets/Kbuild.src
===================================================================
--- busybox-1.24.1.orig/applets/Kbuild.src
+++ busybox-1.24.1/applets/Kbuild.src
@@ -29,7 +29,7 @@ applets/applets.o: include/usage_compres
applets/applet_tables: .config include/applets.h
applets/usage: .config include/applets.h
-applets/usage_pod: .config include/applets.h include/applet_tables.h include/NUM_APPLETS.h
+applets/usage_pod: .config include/applets.h include/applet_tables.h
quiet_cmd_gen_usage_compressed = GEN include/usage_compressed.h
cmd_gen_usage_compressed = $(srctree_slash)applets/usage_compressed include/usage_compressed.h applets
@@ -40,5 +40,7 @@ include/usage_compressed.h: applets/usag
quiet_cmd_gen_applet_tables = GEN include/applet_tables.h
cmd_gen_applet_tables = applets/applet_tables include/applet_tables.h include/NUM_APPLETS.h
-include/applet_tables.h include/NUM_APPLETS.h: applets/applet_tables
+include/NUM_APPLETS.h: applets/applet_tables
$(call cmd,gen_applet_tables)
+
+include/applet_tables.h: include/NUM_APPLETS.h
Index: busybox-1.24.1/applets/applet_tables.c
===================================================================
--- busybox-1.24.1.orig/applets/applet_tables.c
+++ busybox-1.24.1/applets/applet_tables.c
@@ -151,23 +151,15 @@ int main(int argc, char **argv)
// printf("#define MAX_APPLET_NAME_LEN %u\n", MAX_APPLET_NAME_LEN);
if (argv[2]) {
- char line_old[80];
char line_new[80];
FILE *fp;
- line_old[0] = 0;
- fp = fopen(argv[2], "r");
- if (fp) {
- fgets(line_old, sizeof(line_old), fp);
- fclose(fp);
- }
sprintf(line_new, "#define NUM_APPLETS %u\n", NUM_APPLETS);
- if (strcmp(line_old, line_new) != 0) {
- fp = fopen(argv[2], "w");
- if (!fp)
- return 1;
- fputs(line_new, fp);
- }
+ fp = fopen(argv[2], "w");
+ if (!fp)
+ return 1;
+ fputs(line_new, fp);
+ fclose(fp);
}
return 0;

View File

@ -49,8 +49,10 @@ SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
file://CVE-2016-2147_2.patch \
file://ip_fix_problem_on_mips64_n64_big_endian_musl_systems.patch \
file://makefile-fix-backport.patch \
file://parallel-make-fix.patch \
file://0001-sed-fix-sed-n-flushes-pattern-space-terminates-early.patch \
file://busybox-kbuild-race-fix-commit-d8e61bb.patch \
file://commit-applet_tables-fix-commit-0dddbc1.patch \
file://makefile-libbb-race.patch \
"
SRC_URI_append_libc-musl = " file://musl.cfg "