[Libreoffice-commits] core.git: 2 commits - vcl/generic vcl/source
Caolán McNamara
caolanm at redhat.com
Fri Nov 28 08:59:18 PST 2014
vcl/generic/glyphs/gcach_layout.cxx | 14 +++++++-------
vcl/source/fontsubset/sft.cxx | 30 ++++++++++++++++++++++++------
2 files changed, 31 insertions(+), 13 deletions(-)
New commits:
commit b2d3f9b5a12928127b476b10599069efea0ddcde
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Nov 28 16:53:22 2014 +0000
coverity#1213364 Untrusted loop bound
Change-Id: Ifa9912386d34c1bed40dd02d17e4e5402fc82592
diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx
index 2a33640..545222a 100644
--- a/vcl/source/fontsubset/sft.cxx
+++ b/vcl/source/fontsubset/sft.cxx
@@ -409,9 +409,9 @@ static int GetTTGlyphOutline(TrueTypeFont *, sal_uInt32 , ControlPoint **, TTGly
/* returns the number of control points, allocates the pointArray */
static int GetSimpleTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics)
{
- const sal_uInt8* table = getTable( ttf, O_glyf );
+ const sal_uInt8* table = getTable(ttf, O_glyf);
+ const sal_uInt32 nTableSize = getTableSize(ttf, O_glyf);
sal_uInt8 flag, n;
- sal_uInt16 t, lastPoint=0;
int i, j, z;
*pointArray = 0;
@@ -434,14 +434,32 @@ static int GetSimpleTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoin
}
/* determine the last point and be extra safe about it. But probably this code is not needed */
-
+ sal_uInt16 lastPoint=0;
for (i=0; i<numberOfContours; i++) {
- if ((t = GetUInt16(ptr, 10+i*2, 1)) > lastPoint) lastPoint = t;
+ const sal_uInt16 t = GetUInt16(ptr, 10+i*2, 1);
+ if (t > lastPoint)
+ lastPoint = t;
}
sal_uInt16 instLen = GetUInt16(ptr, 10 + numberOfContours*2, 1);
- const sal_uInt8* p = ptr + 10 + 2 * numberOfContours + 2 + instLen;
- sal_uInt16 palen = lastPoint+1;
+
+ const sal_uInt32 nOffset = 10 + 2 * numberOfContours + 2 + instLen;
+ if (nOffset > nTableSize)
+ return 0;
+ const sal_uInt8* p = ptr + nOffset;
+
+ const sal_uInt32 nBytesRemaining = nTableSize - nOffset;
+ const sal_uInt16 palen = lastPoint+1;
+
+ //at a minimum its one byte per entry
+ if (palen > nBytesRemaining)
+ {
+ SAL_WARN("vcl.fonts", "Font " << OUString::createFromAscii(ttf->fname) <<
+ "claimed a palen of "
+ << palen << " but max bytes remaining is " << nBytesRemaining);
+ return 0;
+ }
+
ControlPoint* pa = (ControlPoint*)calloc(palen, sizeof(ControlPoint));
i = 0;
commit 33e8afd668a24285335e42fdcc5d894e046c5bba
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Nov 28 16:55:56 2014 +0000
Revert "Related: deb#766788 alloc on heap instead of stack"
This reverts commit acdf54c4142b7a51b99eacacee470ac31d6ff0ae.
Change-Id: I1c49a5baac3a3421d23926f4479e674ef46fbf34
diff --git a/vcl/generic/glyphs/gcach_layout.cxx b/vcl/generic/glyphs/gcach_layout.cxx
index 0c0bad2..abd04ba 100644
--- a/vcl/generic/glyphs/gcach_layout.cxx
+++ b/vcl/generic/glyphs/gcach_layout.cxx
@@ -372,7 +372,7 @@ bool HbLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
rLayout.Reserve(nGlyphCapacity);
- std::unique_ptr<vcl::ScriptRun> xScriptRun(new vcl::ScriptRun(reinterpret_cast<const UChar *>(rArgs.mpStr), rArgs.mnLength));
+ vcl::ScriptRun aScriptRun(reinterpret_cast<const UChar *>(rArgs.mpStr), rArgs.mnLength);
Point aCurrPos(0, 0);
while (true)
@@ -385,21 +385,21 @@ bool HbLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
// Find script subruns.
int nCurrentPos = nBidiMinRunPos;
HbScriptRuns aScriptSubRuns;
- while (xScriptRun->next())
+ while (aScriptRun.next())
{
- if (xScriptRun->getScriptStart() <= nCurrentPos && xScriptRun->getScriptEnd() > nCurrentPos)
+ if (aScriptRun.getScriptStart() <= nCurrentPos && aScriptRun.getScriptEnd() > nCurrentPos)
break;
}
while (nCurrentPos < nBidiEndRunPos)
{
int32_t nMinRunPos = nCurrentPos;
- int32_t nEndRunPos = std::min(xScriptRun->getScriptEnd(), nBidiEndRunPos);
- HbScriptRun aRun(nMinRunPos, nEndRunPos, xScriptRun->getScriptCode());
+ int32_t nEndRunPos = std::min(aScriptRun.getScriptEnd(), nBidiEndRunPos);
+ HbScriptRun aRun(nMinRunPos, nEndRunPos, aScriptRun.getScriptCode());
aScriptSubRuns.push_back(aRun);
nCurrentPos = nEndRunPos;
- xScriptRun->next();
+ aScriptRun.next();
}
// RTL subruns should be reversed to ensure that final glyph order is
@@ -407,7 +407,7 @@ bool HbLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
if (bRightToLeft)
std::reverse(aScriptSubRuns.begin(), aScriptSubRuns.end());
- xScriptRun->reset();
+ aScriptRun.reset();
for (HbScriptRuns::iterator it = aScriptSubRuns.begin(); it != aScriptSubRuns.end(); ++it)
{
More information about the Libreoffice-commits
mailing list