From 02aee5d174b0a1d0f925dc5c3243f77d0dc0c8c4 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Mon, 2 Jul 2012 07:44:27 +0300 Subject: DirectWrite font engine: don't leak the font table buffer Ideally, each TryGetFontTable() call sequence should be followed by the call to ReleaseFontTable() with the context value taken from the first TryGetFontTable() call, otherwise we'll leak the buffer allocated for the font table. Change-Id: I627bf0133b7f61798e82929723ccfb780ce9ee69 Reviewed-by: Friedemann Kleint Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qfontenginedirectwrite.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'src/gui/text') diff --git a/src/gui/text/qfontenginedirectwrite.cpp b/src/gui/text/qfontenginedirectwrite.cpp index 4843d7f12e..0608368e0f 100644 --- a/src/gui/text/qfontenginedirectwrite.cpp +++ b/src/gui/text/qfontenginedirectwrite.cpp @@ -225,6 +225,8 @@ QFixed QFontEngineDirectWrite::lineThickness() const bool QFontEngineDirectWrite::getSfntTableData(uint tag, uchar *buffer, uint *length) const { + bool ret = false; + if (m_directWriteFontFace) { DWORD t = qbswap(tag); @@ -237,26 +239,22 @@ bool QFontEngineDirectWrite::getSfntTableData(uint tag, uchar *buffer, uint *len ); if (SUCCEEDED(hr)) { - if (!exists) - return false; - - if (buffer == 0) { - *length = tableSize; - return true; - } else if (*length < tableSize) { - return false; + if (exists) { + if (!buffer) { + *length = tableSize; + ret = true; + } else if (*length >= tableSize) { + memcpy(buffer, tableData, tableSize); + ret = true; + } } - - memcpy(buffer, tableData, tableSize); m_directWriteFontFace->ReleaseFontTable(tableContext); - - return true; } else { qErrnoWarning("QFontEngineDirectWrite::getSfntTableData: TryGetFontTable failed"); } } - return false; + return ret; } QFixed QFontEngineDirectWrite::emSquareSize() const -- cgit v1.2.3