[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openembedded-core
Subject:    [OE-core] [PATCH 1/2] bash: Fix a rare make race build failure
From:       "Richard Purdie" <richard.purdie () linuxfoundation ! org>
Date:       2021-06-30 12:12:13
Message-ID: 20210630121214.1965373-1-richard.purdie () linuxfoundation ! org
[Download RAW message or body]

Content-Transfer-Encoding: 8bit

There is a rare make race that occurs in bash due to the way it constructs
certain headers and a build tool. Restructure the creation to remove
the race.

[YOCTO #14227]

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 .../bash/bash/makerace2.patch                 | 98 +++++++++++++++++++
 meta/recipes-extended/bash/bash_5.1.8.bb      |  1 +
 2 files changed, 99 insertions(+)
 create mode 100644 meta/recipes-extended/bash/bash/makerace2.patch

diff --git a/meta/recipes-extended/bash/bash/makerace2.patch \
b/meta/recipes-extended/bash/bash/makerace2.patch new file mode 100644
index 00000000000..43cdd041579
--- /dev/null
+++ b/meta/recipes-extended/bash/bash/makerace2.patch
@@ -0,0 +1,98 @@
+The main makefile can call mkbuiltins from multiple different codepaths in parallel.
+When called, it moves the existing files out the way and creates new ones, then
+compares which will break the build if timing is unlucky.
+
+The root of the problem is mkbuiltins.c creating a file but also referencing that
+file under the same name. By modifing it to allow the final name and the temp name
+to be specified, we can avoid the original reason for the moving of files around.
+This allows them to be created under a new name and then replaced if changed,
+removing any race windows around accessing the files whilst they've been
+moved or are being rewritten.
+
+See [YOCTO #14227]
+
+Upstream-Status: Pending
+Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
+
+Index: bash-5.1.8/builtins/Makefile.in
+===================================================================
+--- bash-5.1.8.orig/builtins/Makefile.in
++++ bash-5.1.8/builtins/Makefile.in
+@@ -185,19 +185,17 @@ gen-helpfiles:	tmpbuiltins.o gen-helpfil
+ 	$(CC_FOR_BUILD) ${CCFLAGS_FOR_BUILD} $(LDFLAGS_FOR_BUILD) -o $@ gen-helpfiles.o \
tmpbuiltins.o $(LIBS_FOR_BUILD) + 
+ builtext.h builtins.c: $(MKBUILTINS) $(DEFSRC)
+-	@-if test -f builtins.c; then mv -f builtins.c old-builtins.c; fi
+-	@-if test -f builtext.h; then mv -f builtext.h old-builtext.h; fi
+-	./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \
++	./$(MKBUILTINS) -externfile builtext-new.h -externfinalfile builtext.h -structfile \
builtins-new.c \ + 	    -noproduction $(DIRECTDEFINE) $(HELPDIRDEFINE) $(HELPSTRINGS) \
$(DEFSRC) +-	@-if cmp -s old-builtext.h builtext.h 2>/dev/null; then \
+-		mv old-builtext.h builtext.h; \
++	@-if ! cmp -s builtext.h builtext-new.h 2>/dev/null; then \
++		mv builtext-new.h builtext.h; \
+ 	 else \
+-		$(RM) old-builtext.h; \
++		$(RM) builtext-new.h; \
+ 	 fi
+-	@-if cmp -s old-builtins.c builtins.c 2>/dev/null; then \
+-		mv old-builtins.c builtins.c; \
++	@-if ! cmp -s builtins.c builtins-new.c 2>/dev/null; then \
++		mv builtins-new.c builtins.c; \
+ 	 else \
+-		$(RM) old-builtins.c; \
++		$(RM) builtins-new.c; \
+ 	 fi
+ 
+ helpdoc:	gen-helpfiles
+Index: bash-5.1.8/builtins/mkbuiltins.c
+===================================================================
+--- bash-5.1.8.orig/builtins/mkbuiltins.c
++++ bash-5.1.8/builtins/mkbuiltins.c
+@@ -113,6 +113,9 @@ char *struct_filename = (char *)NULL;
+ /* The name of the external declaration file. */
+ char *extern_filename = (char *)NULL;
+ 
++/* The final name of the external declaration file. */
++char *extern_final_filename = (char *)NULL;
++
+ /* Here is a structure for manipulating arrays of data. */
+ typedef struct {
+   int size;		/* Number of slots allocated to array. */
+@@ -230,6 +233,8 @@ main (argc, argv)
+ 
+       if (strcmp (arg, "-externfile") == 0)
+ 	extern_filename = argv[arg_index++];
++      else if (strcmp (arg, "-externfinalfile") == 0)
++	extern_final_filename = argv[arg_index++];
+       else if (strcmp (arg, "-structfile") == 0)
+ 	struct_filename = argv[arg_index++];
+       else if (strcmp (arg, "-noproduction") == 0)
+@@ -273,6 +278,9 @@ main (argc, argv)
+ 	}
+     }
+ 
++  if (!extern_final_filename)
++    extern_final_filename = extern_filename;
++
+   /* If there are no files to process, just quit now. */
+   if (arg_index == argc)
+     exit (0);
+@@ -1174,7 +1182,7 @@ write_file_headers (structfile, externfi
+ 	fprintf (structfile, "%s\n", structfile_header[i]);
+ 
+       fprintf (structfile, "#include \"%s\"\n",
+-	       extern_filename ? extern_filename : "builtext.h");
++	       extern_final_filename ? extern_final_filename : "builtext.h");
+ 
+       fprintf (structfile, "#include \"bashintl.h\"\n");
+ 
+@@ -1184,7 +1192,7 @@ write_file_headers (structfile, externfi
+   if (externfile)
+     fprintf (externfile,
+ 	     "/* %s - The list of builtins found in libbuiltins.a. */\n",
+-	     extern_filename ? extern_filename : "builtext.h");
++	     extern_final_filename ? extern_final_filename : "builtext.h");
+ }
+ 
+ /* Write out any necessary closing information for
diff --git a/meta/recipes-extended/bash/bash_5.1.8.bb \
b/meta/recipes-extended/bash/bash_5.1.8.bb index 55d3d0b16ea..5d7704af17b 100644
--- a/meta/recipes-extended/bash/bash_5.1.8.bb
+++ b/meta/recipes-extended/bash/bash_5.1.8.bb
@@ -14,6 +14,7 @@ SRC_URI = "${GNU_MIRROR}/bash/${BP}.tar.gz;name=tarball \
            file://fix-run-builtins.patch \
            file://use_aclocal.patch \
            file://makerace.patch \
+           file://makerace2.patch \
            "
 
 SRC_URI[tarball.sha256sum] = \
                "0cfb5c9bb1a29f800a97bd242d19511c997a1013815b805e0fdd32214113d6be"
-- 
2.30.2



-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#153442): https://lists.openembedded.org/g/openembedded-core/message/153442
Mute This Topic: https://lists.openembedded.org/mt/83890601/4454766
Group Owner: openembedded-core+owner@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [openembedded-core@marc.info]
-=-=-=-=-=-=-=-=-=-=-=-



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic