Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-30630

Segfault between QNetworkAccessManager and Q_GLOBAL_STATIC

    XMLWordPrintable

Details

    • Bug
    • Resolution: Cannot Reproduce
    • P2: Important
    • 5.11.2
    • 5.1.0 Beta 1
    • Network
    • None

    Description

      As seen here: https://codereview.qt-project.org/#change,52828

      and reduced to the following:

      #include <QStringList>
      #include <QCoreApplication>
      
      #include "private/qnetworkconfigmanager_p.h"
      #include "private/qbearerengine_p.h"
      
      struct HoldingType : public QObject
      {
          HoldingType()
          {
              QNetworkConfigurationManagerPrivate *priv = qNetworkConfigurationManagerPrivate();
      
              QBearerEngine *engine = priv->engines()[0];
      
              QStringList keys = engine->accessPointConfigurations.keys();
      
              networkConfiguration.d = engine->accessPointConfigurations[keys[0]];
          }
          QNetworkConfiguration networkConfiguration;
      };
      
      class QSampleCache
      {
      public:
          QSampleCache()
              : t(0) { }
          ~QSampleCache()
          { delete t; }
      
          HoldingType* networkAccessManager()
          {
              if (!t)
                  t = new HoldingType;
              return t;
          }
      private:
          HoldingType *t;
      };
      
      Q_GLOBAL_STATIC(QSampleCache, sampleCache)
      
      int main(int argc, char **argv)
      {
        QCoreApplication app(argc, argv);
      
        sampleCache->networkAccessManager();
      }
      
      

      There is a segfault on exit

      Program received signal SIGSEGV, Segmentation fault.
      0x00007ffff7ae64d8 in QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer (this=0x60b870, __in_chrg=<optimized out>)
          at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qshareddata.h:163
      163         inline ~QExplicitlySharedDataPointer() { if (d && !d->ref.deref()) delete d; }
      (gdb) bt
      #0  0x00007ffff7ae64d8 in QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer (this=0x60b870, __in_chrg=<optimized out>)
          at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qshareddata.h:163
      #1  0x00007ffff7ae5a62 in QNetworkConfiguration::~QNetworkConfiguration (this=0x60b870, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/bearer/qnetworkconfiguration.cpp:227
      #2  0x00007ffff7aa7df5 in QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate (this=0x60b7a0, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:1370
      #3  0x00007ffff7aa7e82 in QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate (this=0x60b7a0, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:1381
      #4  0x00007ffff6bdc814 in QScopedPointerDeleter<QObjectData>::cleanup (pointer=0x60b7a0) at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qscopedpointer.h:62
      #5  0x00007ffff6bdae9d in QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer (this=0x60b788, __in_chrg=<optimized out>)
          at ../../include/QtCore/../../../../../src/qtbase/src/corelib/tools/qscopedpointer.h:98
      #6  0x00007ffff6bd02f4 in QObject::~QObject (this=0x60b780, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/corelib/kernel/qobject.cpp:750
      #7  0x00007ffff7aa5a9b in QNetworkAccessManager::~QNetworkAccessManager (this=0x60b780, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:475
      #8  0x00007ffff7aa5ad2 in QNetworkAccessManager::~QNetworkAccessManager (this=0x60b780, __in_chrg=<optimized out>) at /home/stephen/dev/src/qtbase/src/network/access/qnetworkaccessmanager.cpp:490
      #9  0x00000000004037fa in QSampleCache::~QSampleCache (this=0x606220 <(anonymous namespace)::Q_QGS_sampleCache::innerFunction()::holder>, __in_chrg=<optimized out>) at tst_qsound.cpp:20
      #10 0x0000000000402f23 in (anonymous namespace)::Q_QGS_sampleCache::Holder::~Holder (this=0x606220 <(anonymous namespace)::Q_QGS_sampleCache::innerFunction()::holder>, __in_chrg=<optimized out>)
          at tst_qsound.cpp:37
      #11 0x00007ffff600a121 in __run_exit_handlers (status=0, listp=0x7ffff638f6a8 <__exit_funcs>, run_list_atexit=run_list_atexit@entry=true) at exit.c:77
      #12 0x00007ffff600a1a5 in __GI_exit (status=<optimized out>) at exit.c:99
      #13 0x00007ffff5fefeac in __libc_start_main (main=0x402fe1 <main(int, char**)>, argc=1, ubp_av=0x7fffffffd678, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd668)
          at libc-start.c:294
      #14 0x0000000000401cf9 in _start ()
      
      ==11598== Memcheck, a memory error detector
      ==11598== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
      ==11598== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
      ==11598== Command: ./tst_qsound
      ==11598== 
      ==11598== Invalid read of size 8
      ==11598==    at 0x4ED04D8: QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer() (in /home/stephen/dev/prefix/qtbase/lib/libQt5Network.so.5.2.0)
      ==11598==    by 0x4ECFA61: QNetworkConfiguration::~QNetworkConfiguration() (qnetworkconfiguration.cpp:227)
      ==11598==    by 0x4E91DF4: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1370)
      ==11598==    by 0x4E91E81: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1381)
      ==11598==    by 0x5EC2813: QScopedPointerDeleter<QObjectData>::cleanup(QObjectData*) (qscopedpointer.h:62)
      ==11598==    by 0x5EC0E9C: QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer() (qscopedpointer.h:98)
      ==11598==    by 0x5EB62F3: QObject::~QObject() (qobject.cpp:750)
      ==11598==    by 0x4E8FA9A: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:475)
      ==11598==    by 0x4E8FAD1: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:490)
      ==11598==    by 0x4037F9: QSampleCache::~QSampleCache() (tst_qsound.cpp:20)
      ==11598==    by 0x402F22: (anonymous namespace)::Q_QGS_sampleCache::innerFunction()::Holder::~Holder() (tst_qsound.cpp:37)
      ==11598==    by 0x68B4120: __run_exit_handlers (exit.c:77)
      ==11598==  Address 0xcdb0778 is not stack'd, malloc'd or (recently) free'd
      ==11598== 
      ==11598== 
      ==11598== Process terminating with default action of signal 11 (SIGSEGV)
      ==11598==  Access not within mapped region at address 0xCDB0778
      ==11598==    at 0x4ED04D8: QExplicitlySharedDataPointer<QNetworkConfigurationPrivate>::~QExplicitlySharedDataPointer() (in /home/stephen/dev/prefix/qtbase/lib/libQt5Network.so.5.2.0)
      ==11598==    by 0x4ECFA61: QNetworkConfiguration::~QNetworkConfiguration() (qnetworkconfiguration.cpp:227)
      ==11598==    by 0x4E91DF4: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1370)
      ==11598==    by 0x4E91E81: QNetworkAccessManagerPrivate::~QNetworkAccessManagerPrivate() (qnetworkaccessmanager.cpp:1381)
      ==11598==    by 0x5EC2813: QScopedPointerDeleter<QObjectData>::cleanup(QObjectData*) (qscopedpointer.h:62)
      ==11598==    by 0x5EC0E9C: QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData> >::~QScopedPointer() (qscopedpointer.h:98)
      ==11598==    by 0x5EB62F3: QObject::~QObject() (qobject.cpp:750)
      ==11598==    by 0x4E8FA9A: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:475)
      ==11598==    by 0x4E8FAD1: QNetworkAccessManager::~QNetworkAccessManager() (qnetworkaccessmanager.cpp:490)
      ==11598==    by 0x4037F9: QSampleCache::~QSampleCache() (tst_qsound.cpp:20)
      ==11598==    by 0x402F22: (anonymous namespace)::Q_QGS_sampleCache::innerFunction()::Holder::~Holder() (tst_qsound.cpp:37)
      ==11598==    by 0x68B4120: __run_exit_handlers (exit.c:77)
      ==11598==  If you believe this happened as a result of a stack
      ==11598==  overflow in your program's main thread (unlikely but
      ==11598==  possible), you can try to increase the size of the
      ==11598==  main thread stack using the --main-stacksize= flag.
      ==11598==  The main thread stack size used in this run was 8388608.
      ==11598== 
      ==11598== HEAP SUMMARY:
      ==11598==     in use at exit: 38,731 bytes in 152 blocks
      ==11598==   total heap usage: 79,534 allocs, 79,382 frees, 4,805,467 bytes allocated
      ==11598== 
      ==11598== LEAK SUMMARY:
      ==11598==    definitely lost: 1,692 bytes in 23 blocks
      ==11598==    indirectly lost: 12,765 bytes in 14 blocks
      ==11598==      possibly lost: 5,392 bytes in 15 blocks
      ==11598==    still reachable: 18,882 bytes in 100 blocks
      ==11598==         suppressed: 0 bytes in 0 blocks
      ==11598== Rerun with --leak-check=full to see details of leaked memory
      ==11598== 
      ==11598== For counts of detected and suppressed errors, rerun with: -v
      ==11598== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
      Segmentation fault (core dumped)
      

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            valentyn.doroshchuk Valentyn Doroshchuk
            stephen.kelly Stephen Kelly (Unused account) (Inactive)
            Votes:
            2 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Gerrit Reviews

                There are no open Gerrit changes