[yocto] possible bug with dpkg-native with sstate-cache

Anders Oleson anders at openpuma.org
Tue Dec 13 20:59:42 PST 2016


I have found what I think is a sneaky nasty bug when using package_deb with
SSTATE_MIRRORS on RPM based build hosts. Below is a short description of what
I found and our workaround. A patch that adds a patch that is applied to the
packager that packages the real packager.  To avoid this sneaking failure mode
when building without building when using the cache (its all so very
meta, btw.).

Don't ask how we found this; it wasn't pretty.

Note: the fix approach below actually patches dpkg on the target too,
but I do not
know how to easily make the patch only apply to dpkg-native and not also dpkg.
But in this case it should be fine anyhow; there is no reason that dpkg on the
target should not behave this way too. I have checked the upstream and the
lines in question have never been touched - it is possible they may want to
eventually upstream this too (???).

For future knowledge, is there an easy way to have a SRC_URI list that is
different for dpkg-native than for dpkg?

Also, this is my first post to the group, so apologies if this is not the
right place or way to upload a potential patch; set me straight if so.

Thanks, guys.

Anders.

    The dpkg binary contains a hard-coded CONFIGDIR path which normally points
    to /etc/dpkg. However, if /etc/dpkg/dpkg.cfg.d doesn't exist (ENOTDIR) it
    fails with an error, even though it does not fail when the directory exists
    but is empty (ENOENT).

    Normally this is not an issue, but when dpkg-native is built, CONFIGDIR
    points to a directory in the sysroot under work. If that binary is later
    cached in the sstate-cache and mirrored to another host that does not
    contain the same work directory, the dpkg binary fails due to this missing
    directory during certain packaging steps involving apt-get. This "leaks"
    information about the build host into the sstate-cache in an unintended way
    that causes a failure.

    The dpkg utility does not currently allow a command line or environment
    override of CONFIGDIR, so this patches dpkg so that a missing directory is
    the same as an empty one and the failure is avoided. The dpkg-native is
    always passed command line arguments and does not need, nor contain, any
    configuration data in this directory in the first place
-------------- next part --------------
commit 48441318ced298e58ba2ea4ae1e2332259dcb6f8
Author: Anders <anders at openpuma.org>
Date:   Tue Dec 13 20:10:25 2016 -0800

    patch to workaround sstate-cache bug in dpkg
    
    The dpkg binary contains a hard-coded CONFIGDIR path which normally points to
    /etc/dpkg. However, if /etc/dpkg/dpkg.cfg.d doesn't exist (ENOTDIR) it fails
    with an error, even though it does not fail when the directory exists but is
    empty (ENOENT).
    
    Normally this is not an issue, but when dpkg-native is built, CONFIGDIR points
    to a directory in the sysroot under work. If that binary is later cached in
    the sstate-cache and mirrored to another host that does not contain the same
    work directory, the dpkg binary fails due to this missing directory during
    certain packaging steps involving apt-get. This "leaks" information about the
    build host into the sstate-cache in an unintended way that causes a failure.
    
    The dpkg utility does not currently allow a command line or environment
    override of CONFIGDIR, so this patches dpkg so that a missing directory is the
    same as an empty one and the failure is avoided. The dpkg-native is always
    passed command line arguments and does not need, nor contain, any
    configuration data in this directory in the first place.

diff --git a/meta/recipes-devtools/dpkg/dpkg/allow-missing-config-dir.patch b/meta/recipes-devtools/dpkg/dpkg/allow-missing-config-dir.patch
new file mode 100644
index 0000000..8a52065
--- /dev/null
+++ b/meta/recipes-devtools/dpkg/dpkg/allow-missing-config-dir.patch
@@ -0,0 +1,16 @@
+Index: dpkg-1.18.7/lib/dpkg/options.c
+===================================================================
+--- dpkg-1.18.7.orig/lib/dpkg/options.c
++++ dpkg-1.18.7/lib/dpkg/options.c
+@@ -172,11 +172,8 @@ dpkg_options_load_dir(const char *prog,
+ 
+   dlist_n = scandir(dirname, &dlist, valid_config_filename, alphasort);
+   if (dlist_n < 0) {
+-    if (errno == ENOENT) {
+       free(dirname);
+       return;
+-    } else
+-      ohshite(_("error opening configuration directory '%s'"), dirname);
+   }
+ 
+   for (i = 0; i < dlist_n; i++) {
diff --git a/meta/recipes-devtools/dpkg/dpkg_1.18.7.bb b/meta/recipes-devtools/dpkg/dpkg_1.18.7.bb
index 28fdc13..981fc6b 100644
--- a/meta/recipes-devtools/dpkg/dpkg_1.18.7.bb
+++ b/meta/recipes-devtools/dpkg/dpkg_1.18.7.bb
@@ -7,6 +7,7 @@ SRC_URI = "http://snapshot.debian.org/archive/debian/20160509T100042Z/pool/main/
            file://arch_pm.patch \
            file://dpkg-configure.service \
            file://add_armeb_triplet_entry.patch \
+           file://allow-missing-config-dir.patch \
            file://0002-Adapt-to-linux-wrs-kernel-version-which-has-characte.patch \
            file://0003-Our-pre-postinsts-expect-D-to-be-set-when-running-in.patch \
            file://0004-The-lutimes-function-doesn-t-work-properly-for-all-s.patch \


More information about the yocto mailing list