From 3f42e1a17128a218d1a0ca681ec6af97aa3e834a Mon Sep 17 00:00:00 2001 From: Dyami Caliri Date: Tue, 24 Jun 2014 16:32:39 -0700 Subject: 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 --- src/printsupport/kernel/qprintengine_win.cpp | 28 +++++++++++++--------------- src/printsupport/kernel/qprintengine_win_p.h | 1 + 2 files changed, 14 insertions(+), 15 deletions(-) (limited to 'src/printsupport') 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(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), -- cgit v1.2.3