summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Luth <justin_luth@sil.org>2021-02-23 15:22:47 +0200
committerAdolfo Jayme Barrientos <fitojb@ubuntu.com>2021-02-25 12:34:57 +0100
commit24ad70e40191c3f04ab96fc97e6cd80706ee7e31 (patch)
treeb6f0382a5a3bcb5e2a2eec25dc24408733930406
parent765ee10c399a2c58c2346c9b7336383ed4100bb2 (diff)
tdf#140572 docx export: avoid DocDefault superscript crash
This fixes a crash situation introduced in LO 6.4 by commit d71cf6390a89ea6a4fab724e3a7996f28ca33661. The crash was occurring when the DocDefaults were being exported. Since there was no character or paragraph context, the lookup of the related fontsize was crashing. Moving this variable closer to where it is used "just happens" to fix the crash. Because the DocDefault is considered a style, we are just exporting the superscript/subscript as a default size, and so don't need to know the font size. Thus a style-context position can't cause the crash again. So it isn't a great fix, and leaves the possibility for the same thing to happen in other situations (like RES_CHRATR_BACKGROUND), but at least it quickly solves this known problem, and is easily backportable, as well as following best practice of keeping variables as close to where they are used as possible - eliminating some unnecessary lookups. I did look for a more generic fix (or whether other properties could be affected) and didn't come with any clear examples or a better fix. Change-Id: I03dc3d74a5148973c065cadb09c5c79068f12df1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111403 Tested-by: Jenkins Tested-by: Justin Luth <justin_luth@sil.org> Reviewed-by: Justin Luth <justin_luth@sil.org> (cherry picked from commit 76d2a9fd461dde817fbb1c5d4aa830cb2c42b504) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111458 Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org> (cherry picked from commit 2f26a9c9242b8443f0fb987822404027053a98ff) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111461 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de> Reviewed-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com> Tested-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
-rwxr-xr-xsw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docxbin0 -> 16387 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport16.cxx5
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx2
3 files changed, 6 insertions, 1 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx b/sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx
new file mode 100755
index 000000000000..fd176dc8c896
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf140572_docDefault_superscript.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
index c2d17d965781..c300f7068110 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
@@ -48,6 +48,11 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testFooterMarginLost, "footer-margin-lost.do
assertXPath(pXmlDoc, "/w:document/w:body/w:sectPr/w:pgMar", "footer", "709");
}
+DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf140572_docDefault_superscript, "tdf140572_docDefault_superscript.docx")
+{
+ // A round-trip was crashing.
+}
+
DECLARE_OOXMLEXPORT_TEST(testTdf138953, "croppedAndRotated.odt")
{
CPPUNIT_ASSERT_EQUAL(1, getShapes());
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 4f8773bef97b..018a00c27392 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -7253,9 +7253,9 @@ void DocxAttributeOutput::CharEscapement( const SvxEscapementItem& rEscapement )
if ( !sIss.isEmpty() )
m_pSerializer->singleElementNS(XML_w, XML_vertAlign, FSNS(XML_w, XML_val), sIss);
- const SvxFontHeightItem& rItem = m_rExport.GetItem(RES_CHRATR_FONTSIZE);
if (sIss.isEmpty() || sIss.match("baseline"))
{
+ const SvxFontHeightItem& rItem = m_rExport.GetItem(RES_CHRATR_FONTSIZE);
float fHeight = rItem.GetHeight();
OString sPos = OString::number( round(( fHeight * nEsc ) / 1000) );
m_pSerializer->singleElementNS(XML_w, XML_position, FSNS(XML_w, XML_val), sPos);