summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <Michael.Stahl@cib.de>2019-10-30 16:06:02 +0100
committerVasily Melenchuk <vasily.melenchuk@cib.de>2021-04-13 15:55:06 +0300
commit5ade1dbcae1942a4127e5cbd78a14fadad1a5f3b (patch)
tree52e0636f014a0787033e1ad899deeaa17b4ddfe8
parentc0fd4549d478350bdbdd75a070be013066588e71 (diff)
sw: WW8 import: filter control characters in GetFieldResult()
Triggers the assert in SwSubFont::GetTextSize_() on ooo58234-1.doc, which has a field result with ^G cell separators that is converted to SwInputField, which inserts the field result into SwTextNode. Change-Id: Ibdb93390862a11462d62cf744bac912d6009777e Reviewed-on: https://gerrit.libreoffice.org/81788 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.stahl@cib.de> (cherry picked from commit 3a9d504b01c061f60a915b5681c8313859294118) Reviewed-on: https://gerrit.libreoffice.org/81831 Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
-rw-r--r--sw/source/filter/ww8/ww8par5.cxx31
1 files changed, 30 insertions, 1 deletions
diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
index 963364531d19..bca57b2455f0 100644
--- a/sw/source/filter/ww8/ww8par5.cxx
+++ b/sw/source/filter/ww8/ww8par5.cxx
@@ -31,6 +31,7 @@
#include <com/sun/star/task/InteractionHandler.hpp>
#include <com/sun/star/ucb/XCommandEnvironment.hpp>
+#include <svl/lngmisc.hxx>
#include <svl/urihelper.hxx>
#include <svl/zforlist.hxx>
#include <svl/zformat.hxx>
@@ -1210,7 +1211,35 @@ OUString SwWW8ImplReader::GetFieldResult( WW8FieldDesc const * pF )
m_pStrm->Seek( nOldPos );
//replace both CR 0x0D and VT 0x0B with LF 0x0A
- return sRes.replace(0x0D, 0x0A).replace(0x0B, 0x0A);
+ // at least in the cases where the result is added to an SwInputField
+ // there must not be control characters in it
+ OUStringBuffer buf(sRes.getLength());
+ for (sal_Int32 i = 0; i < sRes.getLength(); ++i)
+ {
+ sal_Unicode const ch(sRes[i]);
+ if (!linguistic::IsControlChar(ch))
+ {
+ buf.append(ch);
+ }
+ else
+ {
+ switch (ch)
+ {
+ case 0x0B:
+ case '\r':
+ buf.append('\n');
+ break;
+ case '\n':
+ case '\t':
+ buf.append(ch);
+ break;
+ default:
+ SAL_INFO("sw.ww8", "GetFieldResult(): filtering control character");
+ break;
+ }
+ }
+ }
+ return buf.makeStringAndClear();
}
/*