Kaydet (Commit) 9432bab9 authored tarafından Luboš Luňák's avatar Luboš Luňák Kaydeden (comit) Tomaž Vajngerl

do not access uninitialized values when printing (tdf#121439)

The assert in the bugreport is triggered by ScPrintFunc::CalcPages() passing
uninitialized values of nEndRow (and others). These variables apparently
get initialized only by constructors that take ScPrintState. These ctors
also set (the somewhat poorly named) bState and the call to CalcPages()
is guarded by this. However, GetPrintState() will simply create ScPrintState
filled with these uninitialized values and later on this will be used
with these ctors, so bState will be set, but nEndRow will be bogus.

Although 5217a2a0 introduced tdf#121439,
this strange bState logic and unitialized variables has been these since
the initial commit, and the code doesn't take any precautions to check
whether the values are valid or not, so I assume this always was just lucky
enough to work and 5217a2a0 finally triggered a problem.

Given that it's rather unclear to me how this is supposed to work properly,
just add an extra flag to both ScPrintFunc and ScPrintState marking whether
the values are set or not and make CalcPages() depends on this flag instead.

Change-Id: I0620de6562865c24f5a0edca2566b01546bf2e2b
Reviewed-on: https://gerrit.libreoffice.org/68739Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
Tested-by: Jenkins
üst 525bc99a
...@@ -150,6 +150,7 @@ struct ScPrintState // Save Variables from ScPrintFunc ...@@ -150,6 +150,7 @@ struct ScPrintState // Save Variables from ScPrintFunc
SCROW nStartRow; SCROW nStartRow;
SCCOL nEndCol; SCCOL nEndCol;
SCROW nEndRow; SCROW nEndRow;
bool bPrintAreaValid; // the 4 variables above are set
sal_uInt16 nZoom; sal_uInt16 nZoom;
size_t nPagesX; size_t nPagesX;
size_t nPagesY; size_t nPagesY;
...@@ -172,6 +173,7 @@ struct ScPrintState // Save Variables from ScPrintFunc ...@@ -172,6 +173,7 @@ struct ScPrintState // Save Variables from ScPrintFunc
, nStartRow(0) , nStartRow(0)
, nEndCol(0) , nEndCol(0)
, nEndRow(0) , nEndRow(0)
, bPrintAreaValid(false)
, nZoom(0) , nZoom(0)
, nPagesX(0) , nPagesX(0)
, nPagesY(0) , nPagesY(0)
...@@ -209,7 +211,7 @@ private: ...@@ -209,7 +211,7 @@ private:
const ScRange* pUserArea; // Selection, if set in dialog const ScRange* pUserArea; // Selection, if set in dialog
const SfxItemSet* pParamSet; // Selected template const SfxItemSet* pParamSet; // Selected template
bool bState; // created from State-struct bool bFromPrintState; // created from State-struct
// Parameter from template: // Parameter from template:
sal_uInt16 nLeftMargin; sal_uInt16 nLeftMargin;
...@@ -258,6 +260,7 @@ private: ...@@ -258,6 +260,7 @@ private:
SCROW nStartRow; SCROW nStartRow;
SCCOL nEndCol; SCCOL nEndCol;
SCROW nEndRow; SCROW nEndRow;
bool bPrintAreaValid; // the 4 variables above are set
sc::PrintPageRanges m_aRanges; sc::PrintPageRanges m_aRanges;
......
...@@ -191,7 +191,7 @@ void ScPrintFunc::Construct( const ScPrintOptions* pOptions ) ...@@ -191,7 +191,7 @@ void ScPrintFunc::Construct( const ScPrintOptions* pOptions )
pParamSet = nullptr; pParamSet = nullptr;
} }
if (!bState) if (!bFromPrintState)
nZoom = 100; nZoom = 100;
nManualZoom = 100; nManualZoom = 100;
bClearWin = false; bClearWin = false;
...@@ -214,13 +214,14 @@ ScPrintFunc::ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTa ...@@ -214,13 +214,14 @@ ScPrintFunc::ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTa
nPageStart ( nPage ), nPageStart ( nPage ),
nDocPages ( nDocP ), nDocPages ( nDocP ),
pUserArea ( pArea ), pUserArea ( pArea ),
bState ( false ), bFromPrintState ( false ),
bSourceRangeValid ( false ), bSourceRangeValid ( false ),
bPrintCurrentTable ( false ), bPrintCurrentTable ( false ),
bMultiArea ( false ), bMultiArea ( false ),
mbHasPrintRange(true), mbHasPrintRange(true),
nTabPages ( 0 ), nTabPages ( 0 ),
nTotalPages ( 0 ), nTotalPages ( 0 ),
bPrintAreaValid ( false ),
pPageData ( pData ) pPageData ( pData )
{ {
pDev = pPrinter.get(); pDev = pPrinter.get();
...@@ -247,6 +248,7 @@ ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* pNewPrinter, ...@@ -247,6 +248,7 @@ ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* pNewPrinter,
nStartRow = rState.nStartRow; nStartRow = rState.nStartRow;
nEndCol = rState.nEndCol; nEndCol = rState.nEndCol;
nEndRow = rState.nEndRow; nEndRow = rState.nEndRow;
bPrintAreaValid = rState.bPrintAreaValid;
nZoom = rState.nZoom; nZoom = rState.nZoom;
m_aRanges.m_nPagesX = rState.nPagesX; m_aRanges.m_nPagesX = rState.nPagesX;
m_aRanges.m_nPagesY = rState.nPagesY; m_aRanges.m_nPagesY = rState.nPagesY;
...@@ -254,7 +256,7 @@ ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* pNewPrinter, ...@@ -254,7 +256,7 @@ ScPrintFunc::ScPrintFunc(ScDocShell* pShell, SfxPrinter* pNewPrinter,
nTotalPages = rState.nTotalPages; nTotalPages = rState.nTotalPages;
nPageStart = rState.nPageStart; nPageStart = rState.nPageStart;
nDocPages = rState.nDocPages; nDocPages = rState.nDocPages;
bState = true; bFromPrintState = true;
if (rState.bSavedStateRanges) if (rState.bSavedStateRanges)
{ {
...@@ -279,13 +281,14 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab, ...@@ -279,13 +281,14 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
nPageStart ( nPage ), nPageStart ( nPage ),
nDocPages ( nDocP ), nDocPages ( nDocP ),
pUserArea ( pArea ), pUserArea ( pArea ),
bState ( false ), bFromPrintState ( false ),
bSourceRangeValid ( false ), bSourceRangeValid ( false ),
bPrintCurrentTable ( false ), bPrintCurrentTable ( false ),
bMultiArea ( false ), bMultiArea ( false ),
mbHasPrintRange(true), mbHasPrintRange(true),
nTabPages ( 0 ), nTabPages ( 0 ),
nTotalPages ( 0 ), nTotalPages ( 0 ),
bPrintAreaValid ( false ),
pPageData ( nullptr ) pPageData ( nullptr )
{ {
pDev = pOutDev; pDev = pOutDev;
...@@ -311,6 +314,7 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, ...@@ -311,6 +314,7 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell,
nStartRow = rState.nStartRow; nStartRow = rState.nStartRow;
nEndCol = rState.nEndCol; nEndCol = rState.nEndCol;
nEndRow = rState.nEndRow; nEndRow = rState.nEndRow;
bPrintAreaValid = rState.bPrintAreaValid;
nZoom = rState.nZoom; nZoom = rState.nZoom;
m_aRanges.m_nPagesX = rState.nPagesX; m_aRanges.m_nPagesX = rState.nPagesX;
m_aRanges.m_nPagesY = rState.nPagesY; m_aRanges.m_nPagesY = rState.nPagesY;
...@@ -318,7 +322,7 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, ...@@ -318,7 +322,7 @@ ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell,
nTotalPages = rState.nTotalPages; nTotalPages = rState.nTotalPages;
nPageStart = rState.nPageStart; nPageStart = rState.nPageStart;
nDocPages = rState.nDocPages; nDocPages = rState.nDocPages;
bState = true; bFromPrintState = true;
if (rState.bSavedStateRanges) if (rState.bSavedStateRanges)
{ {
...@@ -339,6 +343,7 @@ void ScPrintFunc::GetPrintState(ScPrintState& rState, bool bSavePageRanges) ...@@ -339,6 +343,7 @@ void ScPrintFunc::GetPrintState(ScPrintState& rState, bool bSavePageRanges)
rState.nStartRow = nStartRow; rState.nStartRow = nStartRow;
rState.nEndCol = nEndCol; rState.nEndCol = nEndCol;
rState.nEndRow = nEndRow; rState.nEndRow = nEndRow;
rState.bPrintAreaValid = bPrintAreaValid;
rState.nZoom = nZoom; rState.nZoom = nZoom;
rState.nPagesX = m_aRanges.m_nPagesX; rState.nPagesX = m_aRanges.m_nPagesX;
rState.nPagesY = m_aRanges.m_nPagesY; rState.nPagesY = m_aRanges.m_nPagesY;
...@@ -370,6 +375,7 @@ void ScPrintFunc::FillPageData() ...@@ -370,6 +375,7 @@ void ScPrintFunc::FillPageData()
sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( pPageData->GetCount() ); sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( pPageData->GetCount() );
ScPrintRangeData& rData = pPageData->GetData(nCount); // count up ScPrintRangeData& rData = pPageData->GetData(nCount); // count up
assert( bPrintAreaValid );
rData.SetPrintRange( ScRange( nStartCol, nStartRow, nPrintTab, rData.SetPrintRange( ScRange( nStartCol, nStartRow, nPrintTab,
nEndCol, nEndRow, nPrintTab ) ); nEndCol, nEndRow, nPrintTab ) );
// #i123672# // #i123672#
...@@ -696,6 +702,7 @@ bool ScPrintFunc::AdjustPrintArea( bool bNew ) ...@@ -696,6 +702,7 @@ bool ScPrintFunc::AdjustPrintArea( bool bNew )
nStartRow = 0; nStartRow = 0;
if (!pDoc->GetPrintArea( nPrintTab, nEndCol, nEndRow, bNotes )) if (!pDoc->GetPrintArea( nPrintTab, nEndCol, nEndRow, bNotes ))
return false; // nothing return false; // nothing
bPrintAreaValid = true;
} }
else else
{ {
...@@ -734,10 +741,12 @@ bool ScPrintFunc::AdjustPrintArea( bool bNew ) ...@@ -734,10 +741,12 @@ bool ScPrintFunc::AdjustPrintArea( bool bNew )
if (!bFound) if (!bFound)
return false; // empty return false; // empty
bPrintAreaValid = true;
if (bForcedChangeRow) if (bForcedChangeRow)
bChangeRow = true; bChangeRow = true;
} }
assert( bPrintAreaValid );
pDoc->ExtendMerge( nStartCol,nStartRow, nEndCol,nEndRow, nPrintTab ); // no Refresh, incl. Attrs pDoc->ExtendMerge( nStartCol,nStartRow, nEndCol,nEndRow, nPrintTab ); // no Refresh, incl. Attrs
if ( bChangeCol ) if ( bChangeCol )
...@@ -1055,7 +1064,7 @@ void ScPrintFunc::InitParam( const ScPrintOptions* pOptions ) ...@@ -1055,7 +1064,7 @@ void ScPrintFunc::InitParam( const ScPrintOptions* pOptions )
// Split pages // Split pages
if (!bState) if (!bPrintAreaValid)
{ {
nTabPages = CountPages(); // also calculates zoom nTabPages = CountPages(); // also calculates zoom
nTotalPages = nTabPages; nTotalPages = nTabPages;
...@@ -2541,6 +2550,7 @@ long ScPrintFunc::CountNotePages() ...@@ -2541,6 +2550,7 @@ long ScPrintFunc::CountNotePages()
if (bDoThis) if (bDoThis)
{ {
assert( bPrintAreaValid );
for ( SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol ) for ( SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol )
{ {
if (pDoc->HasColNotes(nCol, nPrintTab)) if (pDoc->HasColNotes(nCol, nPrintTab))
...@@ -3000,6 +3010,7 @@ static void lcl_SetHidden( const ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEnt ...@@ -3000,6 +3010,7 @@ static void lcl_SetHidden( const ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEnt
void ScPrintFunc::CalcPages() // calculates aPageRect and pages from nZoom void ScPrintFunc::CalcPages() // calculates aPageRect and pages from nZoom
{ {
assert( bPrintAreaValid );
m_aRanges.calculate(pDoc, aTableParam.bSkipEmpty, aAreaParam.bPrintArea, nStartRow, nEndRow, nStartCol, nEndCol, nPrintTab, GetDocPageSize()); m_aRanges.calculate(pDoc, aTableParam.bSkipEmpty, aAreaParam.bPrintArea, nStartRow, nEndRow, nStartCol, nEndCol, nPrintTab, GetDocPageSize());
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment