summaryrefslogtreecommitdiffstats
path: root/src/printsupport
diff options
context:
space:
mode:
authorDyami Caliri <dyami@dragonframe.com>2014-06-24 16:32:39 -0700
committerDyami Caliri <dyami@dragonframe.com>2014-06-25 20:20:52 +0200
commit3f42e1a17128a218d1a0ca681ec6af97aa3e834a (patch)
tree709f3ef686787a8f6b8afcd960bf204b6241b037 /src/printsupport
parent4b581414fac32b9bf044105e1b9257601ba12571 (diff)
QWin32PrintEnginePrivate check for NULL pDevMode and hdc.
The MSDN documentation states that the pDevMode member of PPRINTER_INFO_2 may be NULL. Also, CreateDC may fail and return a NULL. Rework release() to release resources even if hdc was null. Task-number: QTBUG-39373 Change-Id: Ia08da61bf6ab99f02f0c7a09c608a5d3db34ef65 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src/printsupport')
-rw-r--r--src/printsupport/kernel/qprintengine_win.cpp28
-rw-r--r--src/printsupport/kernel/qprintengine_win_p.h1
2 files changed, 14 insertions, 15 deletions
diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp
index 427af13edf..b97dc6d2c2 100644
--- a/src/printsupport/kernel/qprintengine_win.cpp
+++ b/src/printsupport/kernel/qprintengine_win.cpp
@@ -844,14 +844,13 @@ void QWin32PrintEngine::drawPolygon(const QPointF *points, int pointCount, Polyg
QWin32PrintEnginePrivate::~QWin32PrintEnginePrivate()
{
- if (hdc)
- release();
+ release();
}
void QWin32PrintEnginePrivate::initialize()
{
- if (hdc)
- release();
+ release();
+
Q_ASSERT(!hPrinter);
Q_ASSERT(!hdc);
Q_ASSERT(!devMode);
@@ -878,18 +877,19 @@ void QWin32PrintEnginePrivate::initialize()
if (!ok) {
qErrnoWarning("QWin32PrintEngine::initialize: GetPrinter failed");
- GlobalUnlock(pInfo);
- GlobalFree(hMem);
- ClosePrinter(hPrinter);
- pInfo = 0;
- hMem = 0;
- hPrinter = 0;
+ release();
return;
}
devMode = pInfo->pDevMode;
hdc = CreateDC(NULL, reinterpret_cast<const wchar_t *>(m_printDevice.id().utf16()), 0, devMode);
+ if (!hdc) {
+ qErrnoWarning("QWin32PrintEngine::initialize: CreateDC failed");
+ release();
+ return;
+ }
+
Q_ASSERT(hPrinter);
Q_ASSERT(pInfo);
@@ -941,19 +941,17 @@ void QWin32PrintEnginePrivate::initHDC()
void QWin32PrintEnginePrivate::release()
{
- if (hdc == 0)
- return;
-
if (globalDevMode) { // Devmode comes from print dialog
GlobalUnlock(globalDevMode);
- } else { // Devmode comes from initialize...
+ } else if (hMem) { // Devmode comes from initialize...
// devMode is a part of the same memory block as pInfo so one free is enough...
GlobalUnlock(hMem);
GlobalFree(hMem);
}
if (hPrinter)
ClosePrinter(hPrinter);
- DeleteDC(hdc);
+ if (hdc)
+ DeleteDC(hdc);
hdc = 0;
hPrinter = 0;
diff --git a/src/printsupport/kernel/qprintengine_win_p.h b/src/printsupport/kernel/qprintengine_win_p.h
index 9b944d5921..f698992425 100644
--- a/src/printsupport/kernel/qprintengine_win_p.h
+++ b/src/printsupport/kernel/qprintengine_win_p.h
@@ -125,6 +125,7 @@ public:
globalDevMode(0),
devMode(0),
pInfo(0),
+ hMem(0),
hdc(0),
mode(QPrinter::ScreenResolution),
state(QPrinter::Idle),