glib2.0 >=2.67.3 breaks include from an extern C context

Bug #1916705 reported by Christian Ehrhardt 
12
This bug affects 2 people
Affects Status Importance Assigned to Milestone
glib2.0 (Ubuntu)
Fix Released
Undecided
Iain Lane
open-vm-tools (Ubuntu)
Fix Released
Undecided
Unassigned
qemu (Ubuntu)
Fix Released
Undecided
Unassigned
ukui-control-center (Ubuntu)
Fix Released
Undecided
Unassigned
wireshark (Ubuntu)
Fix Released
Undecided
Unassigned

Bug Description

qemu now breaks in Hirsute (it didn't 23h ago)
Broken:
https://launchpadlibrarian.net/524654684/buildlog_ubuntu-hirsute-amd64.qemu_1%3A5.2+dfsg-6ubuntu1_BUILDING.txt.gz

Good before:
https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/4471/+packages

Error:

../../disas/arm-a64.cc
In file included from /usr/include/glib-2.0/glib/gmacros.h:241,
                 from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9,
                 from /usr/include/glib-2.0/glib/gtypes.h:32,
                 from /usr/include/glib-2.0/glib/galloca.h:32,
                 from /usr/include/glib-2.0/glib.h:30,
                 from /<<BUILDDIR>>/qemu-5.2+dfsg/include/glib-compat.h:32,
                 from /<<BUILDDIR>>/qemu-5.2+dfsg/include/qemu/osdep.h:126,
                 from ../../disas/arm-a64.cc:21:
/usr/include/c++/10/type_traits:56:3: error: template with C linkage
   56 | template<typename _Tp, _Tp __v>
      | ^~~~~~~~
../../disas/arm-a64.cc:20:1: note: ‘extern "C"’ linkage started here
   20 | extern "C" {
      | ^~~~~~~~~~

Also in disas/nanomips.cpp, ...

And indeed disas/arm-a64.cc has:
 20 extern "C" {
 21 #include "qemu/osdep.h"
 22 #include "disas/dis-asm.h"
 23 }

Through the chain of headers as reported above this gets to the templates
in /usr/include/c++/10/type_traits which fails due to that.

So C++ constructs within a C scope which is this bug.

Upstream qemu has not recently changed yet for this.
The code is the same since 2016 via commit e78490c44: "disas/arm-a64.cc:
Include osdep.h first" by Peter Maydell.

But what was different before to break it now?
To find that I was comparing Hirsute vs Hirsute-proposed ...

It is indeed failing in -proposed but working in hirsute-release.

10.2.1-20ubuntu1 : bad

repro in broken build:
$ cd /root/qemu-5.2+dfsg/b/qemu
$ c++ -Ilibcommon.fa.p -I. -I../.. -Iqapi -Itrace -Iui -Iui/shader -I/usr/include/pixman-1 -I/usr/include/virgl -I/usr/include/libpng16 -I/usr/include/spice-server -I/usr/include/spice-1 -I/usr/include/libusb-1.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gio-unix-2.0 -I/usr/include/cacard -I/usr/include/nss -I/usr/include/nspr -I/usr/include/PCSC -I/usr/include/slirp -fdiagnostics-color=auto -pipe -Wall -Winvalid-pch -Wnon-virtual-dtor -std=gnu++11 -O2 -g -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -U_FORTIFY_SOURCE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wundef -Wwrite-strings -fno-strict-aliasing -fno-common -fwrapv -g -O2 -ffile-prefix-map=/root/qemu-5.2+dfsg=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wendif-labels -Wexpansion-to-defined -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong -isystem /root/qemu-5.2+dfsg/linux-headers -isystem linux-headers -iquote /root/qemu-5.2+dfsg/tcg/i386 -iquote . -iquote /root/qemu-5.2+dfsg -iquote /root/qemu-5.2+dfsg/accel/tcg -iquote /root/qemu-5.2+dfsg/include -iquote /root/qemu-5.2+dfsg/disas/libvixl -pthread -fPIE -DSTRUCT_IOVEC_DEFINED -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DNCURSES_WIDECHAR -MD -MQ libcommon.fa.p/disas_nanomips.cpp.o -MF libcommon.fa.p/disas_nanomips.cpp.o.d -o libcommon.fa.p/disas_nanomips.cpp.o -c ../../disas/nanomips.cpp

With that I have a test env...

Doko asked me to test
https://launchpad.net/ubuntu/+source/gcc-10/10.2.1-19ubuntu1/+build/20995220/+files/g++-10_10.2.1-19ubuntu1_amd64.deb
That fails as well, but also good as well as bad case have 10.10.2.1-20ubuntu1
It must be something else.

The difference were ~340 packages I was upgrading them to spot what broke it.
I eventually found glib 2.66 -> 2.67 to break it.

libglib2.0-0/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.0-bin/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.0-data/hirsute-proposed 2.67.4-1 all [upgradable from: 2.66.4-1]
libglib2.0-dev-bin/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.0-dev/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]

Old:
/*
 * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
 * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
 * to factor the check out from callers.
 *
 * This symbol is private.
 */
#undef g_has_typeof
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(__cplusplus)
#define g_has_typeof
#endif

New:
/*
 * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
 * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
 * to factor the check out from callers.
 *
 * This symbol is private.
 */
#undef glib_typeof
#if !defined(__cplusplus) && \
     ((defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \
      defined(__clang__))
#define glib_typeof(t) __typeof__ (t)
#elif defined(__cplusplus) && __cplusplus >= 201103L
/* C++11 decltype() is close enough for our usage */
#include <type_traits> <--- THIS IS WHAT BREAKS US
#define glib_typeof(t) typename std::remove_reference<decltype (t)>::type
#define glib_typeof_2_68
#endif

On the glib side this is due to:
https://gitlab.gnome.org/GNOME/glib/-/issues/2331
Also related:
https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1935
https://<email address hidden>/thread/J3P4TRHLWNDIKXF76OLYZNAPTABCZ3U5/#7LXFUDBBBIT23FE44QJYWX3I7U4EHW6M

Qemu try to fix/discussion at:
https://lists.gnu.org/archive/html/qemu-devel/2021-02/msg07294.html
This won't be the final solution, but it gets things going for the time being.

glib try to fix (also seems not to be ok for upstream, but would get everything going for now). Thanks Laney btw:
https://gitlab.gnome.org/iainl/glib/-/commit/b865b76c01a35fb8dbffb9bc2907acf341a31aba

description: updated
Changed in qemu (Ubuntu):
status: New → Triaged
Revision history for this message
Rik Mills (rikmills) wrote :
Revision history for this message
Iain Lane (laney) wrote :

I'm going to close this bug in the 2.67.5-1 upload which I'm just making to experimental. There will still be "some" projects still affected, but it's as fixed as it's going to get from glib2.0's side - we made the API break opt in for packages that have followed glib's longstanding advice and defined the MAX_ALLOWED/MIN_REQUIRED macros.

Affected projects can do either (but should do both) of these.

  - Define GLIB_VERSION_MAX_ALLOWED to something below GLIB_VERISON_2_66 to opt out or _2_68 to opt in to this new typesafe behaviour.
  - Not include glib's headers in an 'extern "C"' context. GLib has G_{BEGIN,END}_DECLS that might help with this.

Changed in glib2.0 (Ubuntu):
status: New → In Progress
assignee: nobody → Iain Lane (laney)
Revision history for this message
Daniel van Vugt (vanvugt) wrote :

glib2.0 (2.67.5-1) experimental; urgency=medium

Changed in glib2.0 (Ubuntu):
status: In Progress → Fix Committed
Changed in ukui-control-center (Ubuntu):
status: New → Triaged
Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package glib2.0 - 2.67.5-2

---------------
glib2.0 (2.67.5-2) experimental; urgency=medium

  * debian/tests/control: Build-Depend on libc6-dev; the `pollable` test
    requires it. See [upstream MR !1977][0]. The upstream tests now rely on
    finding "libutil.so", which is in libc6-dev. Once that MR, or something
    like it, is merged, we can remove this test-dep as the runtime library
    will be being used.
    [0]: https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1977

 -- Iain Lane <email address hidden> Tue, 02 Mar 2021 18:29:23 +0000

Changed in glib2.0 (Ubuntu):
status: Fix Committed → Fix Released
Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

Thanks Iain for the Fixes in glib.
I need to sort out how to adopt that in qemu for now ...

Also open-vm-tools is also FTBFS by this, so I need to add a task and work on that as well.

Revision history for this message
Launchpad Janitor (janitor) wrote :
Download full text (5.1 KiB)

This bug was fixed in the package qemu - 1:5.2+dfsg-6ubuntu2

---------------
qemu (1:5.2+dfsg-6ubuntu2) hirsute; urgency=medium

  * d/p/u/lp-1916705-disas-Fix-build-with-glib2.0-2.67.3.patch: Fix FTFBS due
    to glib2.0 >=2.67.3 (LP: #1916705)

qemu (1:5.2+dfsg-6ubuntu1) hirsute; urgency=medium

  * Merge with Debian unstable, includes fixes for
    - build operates differently if source is a git repo (LP: #1887535)
    Remaining changes:
    - qemu-kvm to systemd unit
      - d/qemu-kvm-init: script for QEMU KVM preparation modules, ksm,
        hugepages and architecture specifics
      - d/qemu-system-common.qemu-kvm.service: systemd unit to call
        qemu-kvm-init
      - d/qemu-system-common.install: install helper script
      - d/qemu-system-common.qemu-kvm.default: defaults for
        /etc/default/qemu-kvm
      - d/rules: call dh_installinit and dh_installsystemd for qemu-kvm
    - Distribution specific machine type (LP: 1304107 1621042)
      - d/p/ubuntu/define-ubuntu-machine-types.patch: distro machine types
      - d/qemu-system-x86.NEWS Info on fixed machine type definitions
        for host-phys-bits=true (LP: 1776189)
      - add an info about -hpb machine type in debian/qemu-system-x86.NEWS
      - provide pseries-bionic-2.11-sxxm type as convenience with all
        meltdown/spectre workarounds enabled by default. (LP: 1761372).
      - ubuntu-q35 alias added to auto-select the most recent q35 ubuntu type
    - Enable nesting by default
      - d/p/ubuntu/enable-svm-by-default.patch: Enable nested svm by default
        in qemu64 on amd
        [ No more strictly needed, but required for backward compatibility ]
    - improved dependencies
      - Make qemu-system-common depend on qemu-block-extra
      - Make qemu-utils depend on qemu-block-extra
      - let qemu-utils recommend sharutils
    - tolerate ipxe size change on migrations to >=18.04 (LP: 1713490)
      - d/p/ubuntu/pre-bionic-256k-ipxe-efi-roms.patch: old machine types
        reference 256k path
      - d/control-in: depend on ipxe-qemu-256k-compat-efi-roms to be able to
        handle incoming migrations from former releases.
    - d/control-in: Disable capstone disassembler library support (universe)
    - d/qemu-system-x86.README.Debian: add info about updated nesting changes
    - d/control*, d/rules: disable xen by default, but provide universe
      package qemu-system-x86-xen as alternative
      [includes compat links changes of 5.0-5ubuntu4]
    - allow qemu to load old modules post upgrade (LP 1847361)
      - Drop d/qemu-block-extra.*.in, d/qemu-system-gui.*.in
      - d/rules: Drop generating package version into maintainer scripts
      - d/qemu-system-gui.prerm: add no-op prerm to overcome upgrade issues on
        the bad old prerm (LP 1906245 1905377)
    - d/p/ubuntu/lp-1907789-build-no-pie-is-no-functional-liker-flag.patch: fix
      ld usage of -no-pie (LP 1907789)
  * Added changes
    - d/p/u/lp-1916230-hw-s390x-fix-build-for-virtio-9p-ccw.patch: fix
      virtio-9p-ccw being missing (LP: #1916230)

qemu (1:5.2+dfsg-6) unstable; urgency=medium

  * deprecate qemu-debootstrap. It is not needed anymore with
    binfmt F flag, since eve...

Read more...

Changed in qemu (Ubuntu):
status: Triaged → Fix Released
Revision history for this message
Iain Lane (laney) wrote :

> Also open-vm-tools is also FTBFS by this, so I need to add a task and work on that as well.

You want this kind of thing minimally to get over the FTBFS:

--- open-vm-tools-11.2.5.orig/open-vm-tools/configure.ac
+++ open-vm-tools-11.2.5/open-vm-tools/configure.ac
@@ -503,6 +503,9 @@ AC_CHECK_PROG([have_genmarshal],
               [yes],
               [no])

+AC_DEFINE(GLIB_VERSION_MIN_REQUIRED, GLIB_VERSION_2_34, [Ignore post 2.34 deprecations])
+AC_DEFINE(GLIB_VERSION_MAX_ALLOWED, GLIB_VERSION_2_34, [Prevent post 2.34 APIs])
+
 if test "$have_genmarshal" != "yes"; then
    AC_MSG_ERROR([glib-genmarshal is required; make sure it is available in your path.])
 fi

But I would recommend also at least asking upstream to do the full fix and move glib's headers out of 'extern "C"' too as outlined in comment #2 here.

Revision history for this message
Christian Ehrhardt  (paelzer) wrote :
Revision history for this message
Andreas Schultz (aschultz) wrote :

for wireshark the problem can be worked around with this:

diff -up wireshark-3.4.3/debian/rules.orig wireshark-3.4.3/debian/rules
--- wireshark-3.4.3/debian/rules.orig 2021-03-09 10:09:58.184967210 +0100
+++ wireshark-3.4.3/debian/rules 2021-03-09 09:58:39.497405512 +0100
@@ -31,7 +31,8 @@ override_dh_auto_configure-indep:

 override_dh_auto_configure-arch:
  echo "#define VCSVERSION \"$(GIT_VERSION)\"" > version.h
- dh_auto_configure
+ dh_auto_configure -- -DCMAKE_CXX_FLAGS="-DGLIB_VERSION_MIN_REQUIRED=0x024200" \
+ -DCMAKE_C_FLAGS="-DGLIB_VERSION_MIN_REQUIRED=0x024200"

 override_dh_auto_build-arch:
  # regenerate ASN.1 dissectors

Revision history for this message
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in open-vm-tools (Ubuntu):
status: New → Confirmed
Changed in wireshark (Ubuntu):
status: New → Confirmed
Changed in wireshark (Ubuntu):
status: Confirmed → In Progress
Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package wireshark - 3.4.4-1ubuntu1

---------------
wireshark (3.4.4-1ubuntu1) hirsute; urgency=medium

  * Cherrypick upstream commit for SMCD(v2) support LP: #1887933
  * Ensure glib includes are outside extern "C" blocks. LP: #1916705

wireshark (3.4.4-1) unstable; urgency=medium

  * New upstream version 3.4.4
    - security fixes:
      - Wireshark could open unsafe URLs. (CVE-2021-22191)

 -- Dimitri John Ledkov <email address hidden> Mon, 15 Mar 2021 17:01:52 +0000

Changed in wireshark (Ubuntu):
status: In Progress → Fix Released
Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

open-vm-tools fixed in

open-vm-tools (2:11.2.5-2ubuntu1) hirsute; urgency=medium

   * d/p/fix-FTFBS-glib2.0-2.66.3.patch: fix FTBFS with glib2.0 >=2.66.3

-- Christian Ehrhardt <email address hidden> Mon, 08 Mar 2021 12:12:35 +0100

Changed in open-vm-tools (Ubuntu):
status: Confirmed → Fix Released
Revision history for this message
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package ukui-control-center - 3.0.2-2ubuntu1

---------------
ukui-control-center (3.0.2-2ubuntu1) hirsute; urgency=medium

  * Build with -DGLIB_VERSION_MIN_REQUIRED=0x024200 to fix ftbfs with glib2.0.
    LP: #1916705.

 -- Matthias Klose <email address hidden> Thu, 08 Apr 2021 10:02:52 +0200

Changed in ukui-control-center (Ubuntu):
status: Triaged → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.