diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2014-07-25 12:14:54 +0400 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2014-07-31 19:28:05 +0200 |
commit | 5002109313f914674d20a2fac1c38ce5360fb67d (patch) | |
tree | 6b0ee54d68ba7eb01921890d12ce646a5c0c45f9 /src/serialport/qserialport_wince.cpp | |
parent | 26504a5fe1c13af3b84b60eb2a5eb754c80d3c22 (diff) |
Fix leak of a descriptor after unsuccessful opening
In case of unsuccessful initialization of a device at the opening, a
valid descriptor has to be closed before return from the open() method.
Task-number: QTBUG-40414
Change-Id: I45568f176e003d9be1fe8c3017da29f39908efb0
Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com>
Diffstat (limited to 'src/serialport/qserialport_wince.cpp')
-rw-r--r-- | src/serialport/qserialport_wince.cpp | 83 |
1 files changed, 47 insertions, 36 deletions
diff --git a/src/serialport/qserialport_wince.cpp b/src/serialport/qserialport_wince.cpp index 4a523ae6..c06e748c 100644 --- a/src/serialport/qserialport_wince.cpp +++ b/src/serialport/qserialport_wince.cpp @@ -219,43 +219,11 @@ bool QSerialPortPrivate::open(QIODevice::OpenMode mode) return false; } - ::ZeroMemory(&restoredDcb, sizeof(restoredDcb)); - restoredDcb.DCBlength = sizeof(restoredDcb); - - if (!::GetCommState(handle, &restoredDcb)) { - q->setError(decodeSystemError()); - return false; - } - - currentDcb = restoredDcb; - currentDcb.fBinary = true; - currentDcb.fInX = false; - currentDcb.fOutX = false; - currentDcb.fAbortOnError = false; - currentDcb.fNull = false; - currentDcb.fErrorChar = false; - - if (currentDcb.fDtrControl == DTR_CONTROL_HANDSHAKE) - currentDcb.fDtrControl = DTR_CONTROL_DISABLE; - - if (!updateDcb()) - return false; - - if (!::GetCommTimeouts(handle, &restoredCommTimeouts)) { - q->setError(decodeSystemError()); - return false; - } - - ::memset(¤tCommTimeouts, 0, sizeof(currentCommTimeouts)); - currentCommTimeouts.ReadIntervalTimeout = MAXDWORD; - - if (!updateCommTimeouts()) - return false; - - eventNotifier = new CommEventNotifier(eventMask, this, q); - eventNotifier->start(); + if (initialize(eventMask)) + return true; - return true; + ::CloseHandle(handle); + return false; } void QSerialPortPrivate::close() @@ -646,6 +614,49 @@ void QSerialPortPrivate::processIoErrors(bool error) } } +inline bool QSerialPortPrivate::initialize(DWORD eventMask) +{ + Q_Q(QSerialPort); + + ::ZeroMemory(&restoredDcb, sizeof(restoredDcb)); + restoredDcb.DCBlength = sizeof(restoredDcb); + + if (!::GetCommState(handle, &restoredDcb)) { + q->setError(decodeSystemError()); + return false; + } + + currentDcb = restoredDcb; + currentDcb.fBinary = true; + currentDcb.fInX = false; + currentDcb.fOutX = false; + currentDcb.fAbortOnError = false; + currentDcb.fNull = false; + currentDcb.fErrorChar = false; + + if (currentDcb.fDtrControl == DTR_CONTROL_HANDSHAKE) + currentDcb.fDtrControl = DTR_CONTROL_DISABLE; + + if (!updateDcb()) + return false; + + if (!::GetCommTimeouts(handle, &restoredCommTimeouts)) { + q->setError(decodeSystemError()); + return false; + } + + ::memset(¤tCommTimeouts, 0, sizeof(currentCommTimeouts)); + currentCommTimeouts.ReadIntervalTimeout = MAXDWORD; + + if (!updateCommTimeouts()) + return false; + + eventNotifier = new CommEventNotifier(eventMask, this, q); + eventNotifier->start(); + + return true; +} + bool QSerialPortPrivate::updateDcb() { Q_Q(QSerialPort); |