Date: Friday, March 6, 2020 @ 07:37:09
  Author: arojas
Revision: 376831

Fix binary incompatible change in QJsonObject and QJsonArray (FS#65673), sync 
qt5-base-cflags.patch changes from trunk

Added:
  qt5-base/kde-unstable/qtbug-82700.patch
Modified:
  qt5-base/kde-unstable/PKGBUILD
  qt5-base/kde-unstable/qt5-base-cflags.patch

-----------------------+
 PKGBUILD              |   12 ++++----
 qt5-base-cflags.patch |   12 ++++----
 qtbug-82700.patch     |   72 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+), 10 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD    2020-03-06 07:12:18 UTC (rev 376830)
+++ PKGBUILD    2020-03-06 07:37:09 UTC (rev 376831)
@@ -5,7 +5,7 @@
 pkgname=(qt5-base qt5-xcb-private-headers)
 _qtver=5.15.0-beta1
 pkgver=${_qtver/-/}
-pkgrel=2
+pkgrel=3
 arch=('x86_64')
 url='https://www.qt.io'
 license=('GPL3' 'LGPL3' 'FDL' 'custom')
@@ -31,11 +31,13 @@
 
source=("https://download.qt.io/development_releases/qt/${pkgver%.*}/${_qtver}/submodules/${_pkgfqn}.tar.xz";
          qt5-base-cflags.patch
          
qtbug-82547a.patch::"https://code.qt.io/cgit/qt/qtbase.git/patch/?id=ede85452";
-         
qtbug-82547b.patch::"https://code.qt.io/cgit/qt/qtbase.git/patch/?id=1edf586e";)
+         
qtbug-82547b.patch::"https://code.qt.io/cgit/qt/qtbase.git/patch/?id=1edf586e";
+         qtbug-82700.patch)
 sha256sums=('d835c6ba15e1a443bb0114a5eeea4efd512bc74700bb1ae003514d1465cd7b94'
-            'c3ccc95178203a4ce2c84862009309ab507dc84e846f30ddd8cea95564a46c01'
+            '7cbf56fd6076f0c193f06715d1dfdae61905504cb01bd907ac33cc487f48d8c6'
             'd829a91b91f2f0c8c7e50b24ca98a3dca931f5e89f61e5dbd2cbe45ae8d47632'
-            '83ed9cf370078a87ae2dceabc602baccd9a23e6d1aec376344a29cf168ed72d7')
+            '83ed9cf370078a87ae2dceabc602baccd9a23e6d1aec376344a29cf168ed72d7'
+            '38c28c63e86dbae8d27db38d274bb9b5f4d2702feab9023f86d50555c84a96af')
 
 prepare() {
   cd ${_pkgfqn}
@@ -43,6 +45,7 @@
   patch -p1 -i ../qt5-base-cflags.patch # Use system CFLAGS
   patch -p1 -i ../qtbug-82547a.patch # fix build with system mimetype database
   patch -p1 -i ../qtbug-82547b.patch
+  patch -p1 -i ../qtbug-82700.patch # Fix binary incompatible change in 
QJsonObject and QJsonArray
 }
 
 build() {
@@ -61,7 +64,6 @@
     -openssl-linked \
     -nomake examples \
     -no-rpath \
-    -optimized-qmake \
     -dbus-linked \
     -system-harfbuzz \
     -journald \

Modified: qt5-base-cflags.patch
===================================================================
--- qt5-base-cflags.patch       2020-03-06 07:12:18 UTC (rev 376830)
+++ qt5-base-cflags.patch       2020-03-06 07:37:09 UTC (rev 376831)
@@ -2,25 +2,27 @@
 index a493cd5984..79f2d2fff9 100644
 --- a/mkspecs/common/g++-unix.conf
 +++ b/mkspecs/common/g++-unix.conf
-@@ -10,5 +10,5 @@
+@@ -10,5 +10,6 @@
  
  include(g++-base.conf)
  
 -QMAKE_LFLAGS_RELEASE   += -Wl,-O1
-+QMAKE_LFLAGS_RELEASE   += $$(LDFLAGS)
++ENV_LDFLAGS = $$(LDFLAGS)
++QMAKE_LFLAGS_RELEASE   += $$split(ENV_LDFLAGS, " ")
  QMAKE_LFLAGS_NOUNDEF   += -Wl,--no-undefined
 diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
 index 4d82321cba..4a61fc9d25 100644
 --- a/mkspecs/common/gcc-base.conf
 +++ b/mkspecs/common/gcc-base.conf
-@@ -40,8 +40,8 @@ QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os
+@@ -40,8 +40,9 @@ QMAKE_CFLAGS_OPTIMIZE_SIZE = -Os
  QMAKE_CFLAGS_DEPS          += -M
  QMAKE_CFLAGS_WARN_ON       += -Wall -Wextra
  QMAKE_CFLAGS_WARN_OFF      += -w
 -QMAKE_CFLAGS_RELEASE       += $$QMAKE_CFLAGS_OPTIMIZE
 -QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -g
-+QMAKE_CFLAGS_RELEASE       += $$(CFLAGS)
-+QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$(CFLAGS) $$(DEBUG_CFLAGS)
++ENV_CFLAGS = $$(CFLAGS)
++QMAKE_CFLAGS_RELEASE       += $$split(ENV_CFLAGS, " ")
++QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -g $$split(ENV_CFLAGS, " ")
  QMAKE_CFLAGS_DEBUG         += -g
  QMAKE_CFLAGS_SHLIB         += $$QMAKE_CFLAGS_PIC
  QMAKE_CFLAGS_STATIC_LIB    += $$QMAKE_CFLAGS_PIC

Added: qtbug-82700.patch
===================================================================
--- qtbug-82700.patch                           (rev 0)
+++ qtbug-82700.patch   2020-03-06 07:37:09 UTC (rev 376831)
@@ -0,0 +1,72 @@
+From 8ac10bea1fac5dad30bf9ff8a1d43eddc271bfb5 Mon Sep 17 00:00:00 2001
+From: Thiago Macieira <thiago.macie...@intel.com>
+Date: Thu, 05 Mar 2020 15:31:38 -0800
+Subject: [PATCH] Fix binary compatibility issue in QJson{Array,Object} 
initializer_list
+
+The rewrite using CBOR internals replaced one of the two naked pointers
+that were members of QJsonArray and QJsonObject with a
+QExplicitlySharedDataPointer. The problem is that its operator= will
+read the current value to decrement the refcount and possibly delete the
+pointed object.
+
+But QJson{Array,Object}::initialize() are called from inlined code,
+without initialization. So we can't call operator=. We need to memcpy to
+write a nullptr.
+
+This is not unit-testable because it requires compiling against 5.14 or
+earlier, then running against 5.15.
+
+Fixes: QTBUG-82700
+Change-Id: Iaa63461109844e978376fffd15f98c62656d197c
+---
+
+diff --git a/src/corelib/serialization/qjsonarray.cpp 
b/src/corelib/serialization/qjsonarray.cpp
+index 0870277..05138ad 100644
+--- a/src/corelib/serialization/qjsonarray.cpp
++++ b/src/corelib/serialization/qjsonarray.cpp
+@@ -167,7 +167,11 @@
+  */
+ void QJsonArray::initialize()
+ {
+-    a = nullptr;
++    // Because we're being called with uninitialized state, we can't do:
++    //    a = nullptr;
++    // QExplicitlyDataSharedPointer::operator= will read the current value
++    void *ptr = &a;
++    memset(ptr, 0, sizeof(a));
+ }
+ 
+ /*!
+@@ -177,7 +181,6 @@
+ 
+ QJsonArray::QJsonArray(std::initializer_list<QJsonValue> args)
+ {
+-    initialize();
+     for (const auto & arg : args)
+         append(arg);
+ }
+diff --git a/src/corelib/serialization/qjsonobject.cpp 
b/src/corelib/serialization/qjsonobject.cpp
+index a698727..4f0b5cd 100644
+--- a/src/corelib/serialization/qjsonobject.cpp
++++ b/src/corelib/serialization/qjsonobject.cpp
+@@ -150,7 +150,11 @@
+ 
+ void QJsonObject::initialize()
+ {
+-    o = nullptr;
++    // Because we're being called with uninitialized state, we can't do:
++    //    o = nullptr;
++    // QExplicitlyDataSharedPointer::operator= will read the current value
++    void *ptr = &o;
++    memset(ptr, 0, sizeof(o));
+ }
+ 
+ /*!
+@@ -160,7 +164,6 @@
+ 
+ QJsonObject::QJsonObject(std::initializer_list<QPair<QString, QJsonValue> > 
args)
+ {
+-    initialize();
+     for (const auto &arg : args)
+         insert(arg.first, arg.second);
+ }

Reply via email to