sw/source/filter/ww8/ww8par.cxx | 23 +++++++++++++---------- sw/source/filter/ww8/ww8par.hxx | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-)
New commits: commit b2be6ff755301cb0612ce4dd68f32ce61cb98788 Author: Caolán McNamara <caol...@redhat.com> Date: Fri Aug 14 14:40:38 2015 +0100 skip importing properties if the desired start pos is invalid (cherry picked from commit b4a718583a3311dda7abd3010938c847b16e5f30) Change-Id: Iae650d63ccdb95a0a74674b8689813069b750b60 Reviewed-on: https://gerrit.libreoffice.org/17762 Reviewed-by: David Tardon <dtar...@redhat.com> Tested-by: David Tardon <dtar...@redhat.com> diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index 1c42ce0..7ccb338 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -3728,7 +3728,7 @@ void SwWW8ImplReader::ProcessAktCollChange(WW8PLCFManResult& rRes, } } -long SwWW8ImplReader::ReadTextAttr(WW8_CP& rTxtPos, bool& rbStartLine) +long SwWW8ImplReader::ReadTextAttr(WW8_CP& rTxtPos, long nTextEnd, bool& rbStartLine) { long nSkipChars = 0; WW8PLCFManResult aRes; @@ -3793,7 +3793,9 @@ long SwWW8ImplReader::ReadTextAttr(WW8_CP& rTxtPos, bool& rbStartLine) } } - pStrm->Seek(pSBase->WW8Cp2Fc( pPlcxMan->GetCpOfs() + rTxtPos, &bIsUnicode)); + sal_Int32 nRequestedPos = pSBase->WW8Cp2Fc(pPlcxMan->GetCpOfs() + rTxtPos, &bIsUnicode); + bool bValidPos = checkSeek(*pStrm, nRequestedPos); + SAL_WARN_IF(!bValidPos, "sw.ww8", "Document claimed to have text at an invalid position, skip attributes for region"); // Find next Attr position (and Skip attributes of field contents if needed) if (nSkipChars && !bIgnoreText) @@ -3807,7 +3809,7 @@ long SwWW8ImplReader::ReadTextAttr(WW8_CP& rTxtPos, bool& rbStartLine) { if( bDoPlcxManPlusPLus ) pPlcxMan->advance(); - nNext = pPlcxMan->Where(); + nNext = bValidPos ? pPlcxMan->Where() : nTextEnd; if (mpPostProcessAttrsInfo && mpPostProcessAttrsInfo->mnCpStart == nNext) @@ -3817,7 +3819,7 @@ long SwWW8ImplReader::ReadTextAttr(WW8_CP& rTxtPos, bool& rbStartLine) if( (0 <= nNext) && (nSkipPos >= nNext) ) { - nNext = ReadTextAttr( rTxtPos, rbStartLine ); + nNext = ReadTextAttr(rTxtPos, nTextEnd, rbStartLine); bDoPlcxManPlusPLus = false; bIgnoreText = true; } @@ -3868,7 +3870,7 @@ void SwWW8ImplReader::ClearParaEndPosition() maEndParaPos.clear(); } -void SwWW8ImplReader::ReadAttrs(WW8_CP& rNext, WW8_CP& rTxtPos, bool& rbStartLine) +void SwWW8ImplReader::ReadAttrs(WW8_CP& rTxtPos, WW8_CP& rNext, long nTextEnd, bool& rbStartLine) { // Dow we have attributes? if( rTxtPos >= rNext ) @@ -3876,7 +3878,7 @@ void SwWW8ImplReader::ReadAttrs(WW8_CP& rNext, WW8_CP& rTxtPos, bool& rbStartLin do { maCurrAttrCP = rTxtPos; - rNext = ReadTextAttr( rTxtPos, rbStartLine ); + rNext = ReadTextAttr(rTxtPos, nTextEnd, rbStartLine); if (rTxtPos == rNext && rTxtPos == WW8_CP_MAX) break; } @@ -3952,18 +3954,19 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType) SAL_WARN_IF(nTextLen > nMaxPossible, "sw.ww8", "TextLen too long"); nTextLen = nMaxPossible; } - while ( l<nStartCp+nTextLen ) + WW8_CP nTextEnd = nStartCp+nTextLen; + while (l < nTextEnd) { - ReadAttrs( nNext, l, bStartLine );// Takes SectionBreaks into account, too + ReadAttrs( l, nNext, nTextEnd, bStartLine );// Takes SectionBreaks into account, too OSL_ENSURE(pPaM->GetNode().GetTxtNode(), "Missing txtnode"); if (mpPostProcessAttrsInfo != NULL) PostProcessAttrs(); - if( l>= nStartCp + nTextLen ) + if (l >= nTextEnd) break; - bStartLine = ReadChars(l, nNext, nStartCp+nTextLen, nCpOfs); + bStartLine = ReadChars(l, nNext, nTextEnd, nCpOfs); // If the previous paragraph was a dropcap then do not // create a new txtnode and join the two paragraphs together diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 34f1ff4..d9bfe92 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1439,8 +1439,8 @@ private: void ProcessAktCollChange(WW8PLCFManResult& rRes, bool* pStartAttr, bool bCallProcessSpecial); - long ReadTextAttr(WW8_CP& rTxtPos, bool& rbStartLine); - void ReadAttrs(WW8_CP& rNext, WW8_CP& rTxtPos, bool& rbStartLine); + long ReadTextAttr(WW8_CP& rTextPos, long nTextEnd, bool& rbStartLine); + void ReadAttrs(WW8_CP& rTextPos, WW8_CP& rNext, long nTextEnd, bool& rbStartLine); void CloseAttrEnds(); bool ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType);
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits