[Qt-interest] Bug in QNetworkReply abort

Stanislav Kolar skolar at kerio.com
Wed Jul 21 16:46:41 CEST 2010


Hi all,

there is probably a bug in QNetworkAccessManager.
If I call QNetworkReply::abort(), the application crashes. The reply object is result of QNetworkAccessManager::post method.

The call stack is
================================
QtCored4.dll!QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> >::data()  Line 135 + 0x3 bytes	C++
QtCored4.dll!qGetPtrHelper<QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > >(const QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > & p={...})  Line 2314 + 0xb bytes	C++
QtCored4.dll!QObject::d_func()  Line 125 + 0x13 bytes	C++
QtCored4.dll!QMetaObject::activate(QObject * sender=0x00000000, const QMetaObject * m=0x6415efac, int local_signal_index=0x00000007, void * * argv=0x0012d530)  Line 3210 + 0xc bytes	C++
QtNetworkd4.dll!QHttpNetworkReply::dataSendProgress(__int64 _t1=0x0000000001014000, __int64 _t2=0x000000000134fac9)  Line 146 + 0x15 bytes	C++
QtNetworkd4.dll!QHttpNetworkConnectionChannel::sendRequest()  Line 268	C++
QtNetworkd4.dll!QHttpNetworkConnectionChannel::_q_bytesWritten(__int64 bytes=0x0000000000008000)  Line 877	C++
QtNetworkd4.dll!QHttpNetworkConnectionChannel::qt_metacall(QMetaObject::Call _c=InvokeMetaMethod, int _id=0x00000001, void * * _a=0x0012d7e4)  Line 91 + 0x15 bytes	C++
QtCored4.dll!QMetaObject::metacall(QObject * object=0x015554ac, QMetaObject::Call cl=InvokeMetaMethod, int idx=0x00000005, void * * argv=0x0012d7e4)  Line 238	C++
QtCored4.dll!QMetaObject::activate(QObject * sender=0x0151e310, const QMetaObject * m=0x67304f48, int local_signal_index=0x00000001, void * * argv=0x0012d7e4)  Line 3287 + 0x27 bytes	C++
QtCored4.dll!QIODevice::bytesWritten(__int64 _t1=0x0000000000008000)  Line 98 + 0x14 bytes	C++
QtNetworkd4.dll!QAbstractSocketPrivate::flush()  Line 771	C++
QtNetworkd4.dll!QAbstractSocketPrivate::canWriteNotification()  Line 685	C++
QtNetworkd4.dll!QAbstractSocketPrivate::writeNotification()  Line 78 + 0x15 bytes	C++
QtNetworkd4.dll!QAbstractSocketEngine::writeNotification()  Line 161	C++
QtNetworkd4.dll!QWriteNotifier::event(QEvent * e=0x0012dd78)  Line 1130	C++
QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver=0x015877c8, QEvent * e=0x0012dd78)  Line 4302 + 0x11 bytes	C++
QtGuid4.dll!QApplication::notify(QObject * receiver=0x015877c8, QEvent * e=0x0012dd78)  Line 3706 + 0x10 bytes	C++
QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver=0x015877c8, QEvent * event=0x0012dd78)  Line 726 + 0x15 bytes	C++
QtCored4.dll!QCoreApplication::sendEvent(QObject * receiver=0x015877c8, QEvent * event=0x0012dd78)  Line 215 + 0x39 bytes	C++
QtCored4.dll!qt_internal_proc(HWND__ * hwnd=0x004b028c, unsigned int message=0x00000400, unsigned int wp=0x0000015c, long lp=0x00000002)  Line 478 + 0xf bytes	C++
user32.dll!_InternalCallWinProc at 20()  + 0x28 bytes	
user32.dll!_UserCallWinProcCheckWow at 32()  + 0xb7 bytes	
user32.dll!_DispatchMessageWorker at 8()  + 0xdc bytes	
user32.dll!_DispatchMessageW at 4()  + 0xf bytes	
QtCored4.dll!QEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 781	C++
QtGuid4.dll!QGuiEventDispatcherWin32::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 1145 + 0x15 bytes	C++
QtCored4.dll!QEventLoop::processEvents(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 150	C++
QtCored4.dll!QEventLoop::exec(QFlags<enum QEventLoop::ProcessEventsFlag> flags={...})  Line 201 + 0x2d bytes	C++
QtCored4.dll!QCoreApplication::exec()  Line 1003 + 0x15 bytes	C++
QtGuid4.dll!QApplication::exec()  Line 3582	C++

It seems that the loop in

bool QHttpNetworkConnectionChannel::sendRequest()

tries to 

emit reply->dataSendProgress(written, bytesTotal);

even though QHttpNetworkReply *reply is already destroyed - it is deleted by destructor of QNetworkAccessHttpBacked - the QHttpNetworkReply object is its children:

QtNetworkd4.dll!QHttpNetworkReply::~QHttpNetworkReply()  Line 64	C++
QtNetworkd4.dll!QHttpNetworkReply::`scalar deleting destructor'()  + 0xf bytes	C++
QtCored4.dll!QObjectPrivate::deleteChildren()  Line 1978 + 0x24 bytes	C++
QtCored4.dll!QObject::~QObject()  Line 977	C++
QtNetworkd4.dll!QNetworkAccessBackend::~QNetworkAccessBackend()  Line 157 + 0x9 bytes	C++
QtNetworkd4.dll!QNetworkAccessHttpBackend::~QNetworkAccessHttpBackend()  Line 309 + 0x3d bytes	C++
QtNetworkd4.dll!QNetworkAccessHttpBackend::`scalar deleting destructor'()  + 0xf bytes	C++
QtCored4.dll!qDeleteInEventHandler(QObject * o=0x01587a08)  Line 3993 + 0x21 bytes	C++
QtCored4.dll!QObject::event(QEvent * e=0x01ffa7b8)  Line 1223 + 0xc bytes	C++
QtGuid4.dll!QApplicationPrivate::notify_helper(QObject * receiver=0x01587a08, QEvent * e=0x01ffa7b8)  Line 4302 + 0x11 bytes	C++
QtGuid4.dll!QApplication::notify(QObject * receiver=0x01587a08, QEvent * e=0x01ffa7b8)  Line 3706 + 0x10 bytes	C++
QtCored4.dll!QCoreApplication::notifyInternal(QObject * receiver=0x01587a08, QEvent * event=0x01ffa7b8)  Line 726 + 0x15 bytes	C++
..


Did I something wrong ? Is it a known bug ? Or have somebody some advise/question ?

Stanislav Kolar
Research & Development
.................................................................
Kerio Technologies
Anglicke nabrezi 1, 301 49 Plzen
Czech Republic
tel. 377 338 901, fax 377 338 921
www.kerio.com
.................................................................
Connect. Communicate. Collaborate. Securely.







More information about the Qt-interest-old mailing list