sc/source/filter/html/htmlpars.cxx | 42 ++++++++++++++++++++++++------------ sw/source/core/docnode/ndtbl.cxx | 43 ++++++++++++++++++++++++++++++++++--- 2 files changed, 69 insertions(+), 16 deletions(-)
New commits: commit f0e1e2cbb91f00dba3e82c1de70a5d961e5800a7 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Fri Mar 29 19:53:17 2024 +0000 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Apr 3 14:38:23 2024 +0200 ofz#67708 ignore oversized colspans that can't fit in SCCOL ignore negative colspan and rowspans too Change-Id: I79a010bcd7d9d84de70f6dac2e09614d6d448227 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165480 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit b2c3ca63d28f7849d33d7a0c6436102fdbf6dbbb) diff --git a/sc/source/filter/html/htmlpars.cxx b/sc/source/filter/html/htmlpars.cxx index d6cbb38ba512..dc51403a06a0 100644 --- a/sc/source/filter/html/htmlpars.cxx +++ b/sc/source/filter/html/htmlpars.cxx @@ -924,12 +924,20 @@ void ScHTMLLayoutParser::TableDataOn( HtmlImportInfo* pInfo ) { case HtmlOptionId::COLSPAN: { - mxActEntry->nColOverlap = static_cast<SCCOL>(rOption.GetString().toInt32()); + sal_Int32 nColOverlap = rOption.GetString().toInt32(); + if (nColOverlap >= 0 && nColOverlap <= SCCOL_MAX) + mxActEntry->nColOverlap = static_cast<SCCOL>(nColOverlap); + else + SAL_WARN("sc", "ScHTMLLayoutParser::TableDataOn ignoring colspan: " << nColOverlap); } break; case HtmlOptionId::ROWSPAN: { - mxActEntry->nRowOverlap = static_cast<SCROW>(rOption.GetString().toInt32()); + sal_Int32 nRowOverlap = rOption.GetString().toInt32(); + if (nRowOverlap >= 0) + mxActEntry->nRowOverlap = static_cast<SCROW>(nRowOverlap); + else + SAL_WARN("sc", "ScHTMLLayoutParser::TableDataOn ignoring rowspan: " << nRowOverlap); } break; case HtmlOptionId::ALIGN: commit 46c3b103e50f83e092ef7f25d34649d556b382d0 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Thu Mar 28 09:09:00 2024 +0000 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Apr 3 14:38:08 2024 +0200 ofz: negative column offset Change-Id: Ieeb06e5c5d28f1c457db369a732bc37a7d5f2be8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165419 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> (cherry picked from commit 3f8c81f3f9ba1e27c97894c73e8802e5fdecf94b) diff --git a/sc/source/filter/html/htmlpars.cxx b/sc/source/filter/html/htmlpars.cxx index b83e50a2f941..d6cbb38ba512 100644 --- a/sc/source/filter/html/htmlpars.cxx +++ b/sc/source/filter/html/htmlpars.cxx @@ -747,6 +747,11 @@ void ScHTMLLayoutParser::SetWidths() OSL_ENSURE( nCol < nColsPerRow, "ScHTMLLayoutParser::SetWidths: column overflow" ); if (nCol >= nColsPerRow) continue; + if (nCol < 0) + { + SAL_WARN("sc", "negative offset: " << nCol); + continue; + } pE->nOffset = pOffsets[nCol]; nCol = nCol + pE->nColOverlap; if ( nCol > nColsPerRow ) commit 61da8a0ce33b7637404446eb0e0652d3c6177f61 Author: Caolán McNamara <caolan.mcnam...@collabora.com> AuthorDate: Sat Mar 23 15:40:26 2024 +0000 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Apr 3 14:35:43 2024 +0200 ofz#67540 negative offset Change-Id: I498985962feb7d77c1a71af7002a85aa02aa3e65 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165189 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit d2210a5b418e7cbdef9a0de0fe3d9fd91115eb49) diff --git a/sc/source/filter/html/htmlpars.cxx b/sc/source/filter/html/htmlpars.cxx index d6dbb6f8f729..b83e50a2f941 100644 --- a/sc/source/filter/html/htmlpars.cxx +++ b/sc/source/filter/html/htmlpars.cxx @@ -741,19 +741,22 @@ void ScHTMLLayoutParser::SetWidths() for ( size_t i = nFirstTableCell, nListSize = maList.size(); i < nListSize; ++i ) { auto& pE = maList[ i ]; - if ( pE->nTab == nTable ) + if (pE->nTab != nTable) + continue; + nCol = pE->nCol - nColCntStart; + OSL_ENSURE( nCol < nColsPerRow, "ScHTMLLayoutParser::SetWidths: column overflow" ); + if (nCol >= nColsPerRow) + continue; + pE->nOffset = pOffsets[nCol]; + nCol = nCol + pE->nColOverlap; + if ( nCol > nColsPerRow ) + nCol = nColsPerRow; + if (nCol < 0) { - nCol = pE->nCol - nColCntStart; - OSL_ENSURE( nCol < nColsPerRow, "ScHTMLLayoutParser::SetWidths: column overflow" ); - if ( nCol < nColsPerRow ) - { - pE->nOffset = pOffsets[nCol]; - nCol = nCol + pE->nColOverlap; - if ( nCol > nColsPerRow ) - nCol = nColsPerRow; - pE->nWidth = pOffsets[nCol] - pE->nOffset; - } + SAL_WARN("sc", "negative offset: " << nCol); + continue; } + pE->nWidth = pOffsets[nCol] - pE->nOffset; } } } commit f2bc8215e2956f9a0fb30dc5b33d4466e35f424f Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Fri Mar 22 14:27:01 2024 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Apr 3 14:32:56 2024 +0200 tdf#157241 sw: assert when importing ToX in table in rhbz589883-2.docx ndtbl.cxx:1417: SwNodes::TextToTable(): Assertion `!rNode.IsSectionNode()' failed. (regression from commit 62cb3b8b8d6106c6aeb073b12d84973a107182ef) Change-Id: Iec12282573cb914d1924f4da4a28e26e01b866df Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165164 Tested-by: Michael Stahl <michael.st...@allotropia.de> Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit df6fdb0041f8bfd251a4b03030b8bc47f0614c36) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165172 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit 921abac0a5a0caa46875db640e3432379a5bcfa7) diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx index 450500c1fd70..7384d235309e 100644 --- a/sw/source/core/docnode/ndtbl.cxx +++ b/sw/source/core/docnode/ndtbl.cxx @@ -1418,16 +1418,19 @@ SwTableNode* SwNodes::TextToTable( const SwNodes::TableRanges_t & rTableNodes, // delete frames of all contained content nodes for( nLines = 0; aNodeIndex <= rTableNodes.rbegin()->rbegin()->aEnd; ++aNodeIndex,++nLines ) { - SwNode& rNode = aNodeIndex.GetNode(); - assert(!rNode.IsSectionNode()); // not possible in writerfilter import - if (rNode.IsTableNode()) + SwNode* pNode(&aNodeIndex.GetNode()); + while (pNode->IsSectionNode()) // could be ToX field in table { - lcl_RemoveBreaksTable(static_cast<SwTableNode&>(rNode), + pNode = pNode->GetNodes()[pNode->GetIndex()+1]; + } + if (pNode->IsTableNode()) + { + lcl_RemoveBreaksTable(static_cast<SwTableNode&>(*pNode), (0 == nLines) ? pTableFormat : nullptr); } - else if (rNode.IsContentNode()) + else if (pNode->IsContentNode()) { - lcl_RemoveBreaks(static_cast<SwContentNode&>(rNode), + lcl_RemoveBreaks(static_cast<SwContentNode&>(*pNode), (0 == nLines) ? pTableFormat : nullptr); } } commit 98b7ea70fd951e12c9ab1bbe09357ad5f874e473 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Wed Mar 13 18:57:21 2024 +0100 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Wed Apr 3 14:32:56 2024 +0200 tdf#157241 sw: fix crash on RTF paste or insert of nested tables The problem is that there are tables with only empty cell frames in the layout, which causes a crash in IsAllHiddenCell() added in commit ab7893544dc6be6dc192dffefd57cd5ddd421c35. This happens because first inner tables are created, with layout frames because the layout already exists. Then when SwNodes::TextToTable() is called for the outer table, it deletes the SwTextFrames, but not the SwTabFrames/SwCellFrames, so they remain uselessly in the layout. Delete these too, they will be recreated when the frame for the outer table is created. Also the transfer of any existing break to the outer table was missing. Change-Id: Idc2bc1d4c6572702510ae4355e4015c42770eb3e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164788 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@allotropia.de> (cherry picked from commit 62cb3b8b8d6106c6aeb073b12d84973a107182ef) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164814 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> (cherry picked from commit 56676a8cb6899f376d9893392700e096ad589bed) diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx index e76a0bbf1f3f..450500c1fd70 100644 --- a/sw/source/core/docnode/ndtbl.cxx +++ b/sw/source/core/docnode/ndtbl.cxx @@ -887,6 +887,34 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTableOpts, return &rNdTable; } +static void lcl_RemoveBreaksTable(SwTableNode & rNode, SwTableFormat *const pTableFormat) +{ + // delete old layout frames, new ones need to be created... + rNode.DelFrames(nullptr); + + // remove PageBreaks/PageDesc/ColBreak + SwFrameFormat & rFormat(*rNode.GetTable().GetFrameFormat()); + + if (const SvxFormatBreakItem* pItem = rFormat.GetItemIfSet(RES_BREAK, false)) + { + if (pTableFormat) + { + pTableFormat->SetFormatAttr(*pItem); + } + rFormat.ResetFormatAttr(RES_BREAK); + } + + SwFormatPageDesc const*const pPageDescItem(rFormat.GetItemIfSet(RES_PAGEDESC, false)); + if (pPageDescItem && pPageDescItem->GetPageDesc()) + { + if (pTableFormat) + { + pTableFormat->SetFormatAttr(*pPageDescItem); + } + rFormat.ResetFormatAttr(RES_PAGEDESC); + } +} + static void lcl_RemoveBreaks(SwContentNode & rNode, SwTableFormat *const pTableFormat) { // delete old layout frames, new ones need to be created... @@ -1391,7 +1419,13 @@ SwTableNode* SwNodes::TextToTable( const SwNodes::TableRanges_t & rTableNodes, for( nLines = 0; aNodeIndex <= rTableNodes.rbegin()->rbegin()->aEnd; ++aNodeIndex,++nLines ) { SwNode& rNode = aNodeIndex.GetNode(); - if( rNode.IsContentNode() ) + assert(!rNode.IsSectionNode()); // not possible in writerfilter import + if (rNode.IsTableNode()) + { + lcl_RemoveBreaksTable(static_cast<SwTableNode&>(rNode), + (0 == nLines) ? pTableFormat : nullptr); + } + else if (rNode.IsContentNode()) { lcl_RemoveBreaks(static_cast<SwContentNode&>(rNode), (0 == nLines) ? pTableFormat : nullptr);