summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@nokia.com>2010-02-16 14:04:57 (GMT)
committerJoerg Bornemann <joerg.bornemann@nokia.com>2010-02-16 15:22:25 (GMT)
commitc09ef77cd271c47cb3c2607553dab669d6cbcddc (patch)
tree45b46b7a5c234812c5d525ddce8e7591f340d444 /src/network
parenta0d948ca915f932857ecbb711dad60a78fdb1f54 (diff)
downloadQt-c09ef77cd271c47cb3c2607553dab669d6cbcddc.zip
Qt-c09ef77cd271c47cb3c2607553dab669d6cbcddc.tar.gz
Qt-c09ef77cd271c47cb3c2607553dab669d6cbcddc.tar.bz2
fix pipe handle leak in qlocalsocket_win.cpp
Destroying a QLocalSocket with unwritten data left unclosed handles behind. The connection wasn't closed properly, such that the other end didn't get notified about the connection loss. Task-number: QTBUG-7815 Reviewed-by: ossi
Diffstat (limited to 'src/network')
-rw-r--r--src/network/socket/qlocalsocket_p.h6
-rw-r--r--src/network/socket/qlocalsocket_win.cpp17
2 files changed, 17 insertions, 6 deletions
diff --git a/src/network/socket/qlocalsocket_p.h b/src/network/socket/qlocalsocket_p.h
index 081697b..0f1c23c 100644
--- a/src/network/socket/qlocalsocket_p.h
+++ b/src/network/socket/qlocalsocket_p.h
@@ -128,10 +128,8 @@ public:
void _q_stateChanged(QAbstractSocket::SocketState newState);
void _q_error(QAbstractSocket::SocketError newError);
#elif defined(Q_OS_WIN)
- ~QLocalSocketPrivate() {
- CloseHandle(overlapped.hEvent);
- }
-
+ ~QLocalSocketPrivate();
+ void destroyPipeHandles();
void setErrorString(const QString &function);
void _q_notified();
void _q_canWrite();
diff --git a/src/network/socket/qlocalsocket_win.cpp b/src/network/socket/qlocalsocket_win.cpp
index 1f94df6..7a1e84b 100644
--- a/src/network/socket/qlocalsocket_win.cpp
+++ b/src/network/socket/qlocalsocket_win.cpp
@@ -110,6 +110,20 @@ QLocalSocketPrivate::QLocalSocketPrivate() : QIODevicePrivate(),
{
}
+QLocalSocketPrivate::~QLocalSocketPrivate()
+{
+ destroyPipeHandles();
+ CloseHandle(overlapped.hEvent);
+}
+
+void QLocalSocketPrivate::destroyPipeHandles()
+{
+ if (handle != INVALID_HANDLE_VALUE) {
+ DisconnectNamedPipe(handle);
+ CloseHandle(handle);
+ }
+}
+
void QLocalSocket::connectToServer(const QString &name, OpenMode openMode)
{
Q_D(QLocalSocket);
@@ -388,8 +402,7 @@ void QLocalSocket::close()
d->readSequenceStarted = false;
d->pendingReadyRead = false;
d->pipeClosed = false;
- DisconnectNamedPipe(d->handle);
- CloseHandle(d->handle);
+ d->destroyPipeHandles();
d->handle = INVALID_HANDLE_VALUE;
ResetEvent(d->overlapped.hEvent);
d->state = UnconnectedState;