]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core.git/commitdiff
busybox: always start do_compile with orig config files
authorAntonin Godard <antoningodard@pm.me>
Mon, 9 Jan 2023 09:04:53 +0000 (09:04 +0000)
committerSteve Sakoman <steve@sakoman.com>
Fri, 20 Jan 2023 02:28:32 +0000 (16:28 -1000)
When compiling busybox a second time (e.g. with `compile -f`), busybox
can use an altered autoconf.h file for compiling, which can ultimately
produces different and unwanted binaries.

This can produce errors like this one:

ERROR: busybox-1.35.0-r0 do_package: Error executing a python function in exec_func_python() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_func_python() autogenerated', lineno: 2, function: <module>
     0001:
 *** 0002:ptest_update_alternatives(d)
     0003:
File: '…/poky/meta/classes/ptest.bbclass', lineno: 100, function: ptest_update_alternatives
     0096:        for alt_name, alt_link, alt_target, _ in alternatives:
     0097:            # Some alternatives are for man pages,
     0098:            # check if the alternative is in PATH
     0099:            if os.path.dirname(alt_link) in bin_paths:
 *** 0100:                os.symlink(alt_target, os.path.join(ptest_bindir, alt_name))
     0101:}
     0102:
     0103:do_configure_ptest_base[dirs] = "${B}"
     0104:do_compile_ptest_base[dirs] = "${B}"
Exception: FileExistsError: [Errno 17] File exists: '/bin/busybox.suid' -> '…/busybox/1.35.0-r0/package/usr/lib/busybox/ptest/bin/login'

This happens because ALTERNATIVE:busybox contains `/bin/login` twice,
initially that's because `/bin/login` is present in both
busybox.links.suid and busybox.links.nosuid. The reason for that is
because of the altered autoconf.h.

Steps to reproduce above error:

<add ptest to distro configs>
bitbake busybox -c clean
bitbake busybox -c package -f
bitbake busybox -c compile -f
bitbake busybox -c package -f

This patch guards against potential bugs by:

- making a backup of .config and autoconf.h that have matching
  timestamps.
- make sure do_compile always starts with these files.
- restore .config and autoconf.h at the end of do_compile.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 6b4a0f063edcfe0a5a4f418842e86ac0c46d9cad)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
meta/recipes-core/busybox/busybox.inc

index 5f1c473d5ea5b7d498a77fe215e140a0a2421d31..dff4a5dec9979638fea91a81ec56f4f527901e06 100644 (file)
@@ -138,19 +138,23 @@ do_configure () {
        do_prepare_config
        merge_config.sh -m .config ${@" ".join(find_cfgs(d))}
        cml1_do_configure
+
+       # Save a copy of .config and autoconf.h.
+       cp .config .config.orig
+       cp include/autoconf.h include/autoconf.h.orig
 }
 
 do_compile() {
        unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS
        export KCONFIG_NOTIMESTAMP=1
 
+       # Ensure we start do_compile with the original .config and autoconf.h.
+       # These files should always have matching timestamps.
+       cp .config.orig .config
+       cp include/autoconf.h.orig include/autoconf.h
+
        if [ "${BUSYBOX_SPLIT_SUID}" = "1" -a x`grep "CONFIG_FEATURE_INDIVIDUAL=y" .config` = x ]; then
                # split the .config into two parts, and make two busybox binaries
-               if [ -e .config.orig ]; then
-                       # Need to guard again an interrupted do_compile - restore any backup
-                       cp .config.orig .config
-               fi
-               cp .config .config.orig
                oe_runmake busybox.cfg.suid
                oe_runmake busybox.cfg.nosuid
 
@@ -187,15 +191,18 @@ do_compile() {
                        bbfatal "busybox suid binary incorrectly provides /bin/sh"
                fi
 
-               # copy .config.orig back to .config, because the install process may check this file
-               cp .config.orig .config
                # cleanup
-               rm .config.orig .config.app.suid .config.app.nosuid .config.disable.apps .config.nonapps
+               rm .config.app.suid .config.app.nosuid .config.disable.apps .config.nonapps
        else
                oe_runmake busybox_unstripped
                cp busybox_unstripped busybox
                oe_runmake busybox.links
        fi
+
+       # restore original .config and autoconf.h, because the install process
+       # may check these files
+       cp .config.orig .config
+       cp include/autoconf.h.orig include/autoconf.h
 }
 
 do_install () {