Ladies & gents, attached patch (somehow) fixes the crash in Calc's DataPilot caused by field indexes being off-by-N. Consequent attempt to move such fields leads to segfault. It is regression from 3.3, the orig code was as follows: SCCOL nColAdd = 0; if ( bForFile ) { // in old file format, columns are within document, not within source range DBG_ASSERT( pSheetDesc, "FillOldParam: bForFile, !pSheetDesc" ); nColAdd = pSheetDesc->aSourceRange.aStart.Col(); } where 'if' branch has been unused since 2004 at least, as 'bForFile' variable has been always set to false elsewhere in the code. Later, it has been changed into this: SCCOL nColAdd = pSheetDesc->GetSourceRange().aStart.Col(); apparently to fix a build failure (commit 523a8f41388f6d). But this seems to produce wrong results -- shifts column index of DP field by N and attempt to move such field crashes the whole thing. From the comment in the 3.3 code (mentioning "old file format") I guess we can assume column offset always set to 0 i.e. no column offset at all. But not really sure about that, this is Yoshida-san's baby. Consequently, some further code cleanup could be needed (i.e. nCollAdd param can be completely removed from lcl_FillOldFields() ), but that's more a material for master branch hB. -- \\\\\ Katarina Machalkova \\\\\\\__o LibO developer __\\\\\\\'/_ & hedgehog painter
From 19dada4d1cf45b1042788cd6ec3c7ea56c45e3a6 Mon Sep 17 00:00:00 2001 From: Katarina Machalkova <kmachalkova@suse.cz> Date: Mon, 27 Jun 2011 13:35:01 +0200 Subject: [PATCH] fdo#38456: Always set column offset to 0 Setting it to anything else moves field indexes off-by-N and causes crash in some cases (the original code has been unused since 2004 at least) --- sc/source/core/data/dpobject.cxx | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx index 472c451..93bfebb 100644 --- a/sc/source/core/data/dpobject.cxx +++ b/sc/source/core/data/dpobject.cxx @@ -1860,9 +1860,6 @@ sal_Bool ScDPObject::FillOldParam(ScPivotParam& rParam) const // ppLabelArr / nLabels is not changed SCCOL nSrcColOffset = 0; - if (IsSheetData()) - // source data column offset is only for internal sheet source. - nSrcColOffset = pSheetDesc->GetSourceRange().aStart.Col(); bool bAddData = ( lcl_GetDataGetOrientation( xSource ) == sheet::DataPilotFieldOrientation_HIDDEN ); lcl_FillOldFields( -- 1.7.3.4
Attachment:
signature.asc
Description: This is a digitally signed message part.