[Libreoffice-commits] core.git: writerfilter/qa writerfilter/source

Mike Kaganski mike.kaganski at collabora.com
Tue Dec 8 00:16:58 PST 2015


 writerfilter/qa/cppunittests/misc/misc.cxx        |   20 ++++++++++++++++++++
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |   18 +++++++++---------
 2 files changed, 29 insertions(+), 9 deletions(-)

New commits:
commit e4d5b5efac71ed2a08dcd09877078a6cf6bde0d2
Author: Mike Kaganski <mike.kaganski at collabora.com>
Date:   Mon Dec 7 23:00:32 2015 +1000

    tdf#54584: adjust skip-slash condition, allow unterminated quote
    
    Experimenting with different non-alpha characters in front of
    field, most of them aren't allowed and result in field not
    recognized by MS Word: #$%&'()*+,-./:;<>?@[]^_`{|}~
    Besides, if backslash "\" is followed by another backslash or
    space, it is illegal, too. This patch takes care of it.
    
    On the other side, not closing quotes is allowed by MS Word.
    This patch allows this, too.
    
    The patch does not handle another allowed field code "=2+2".
    This should be done in another commit.
    
    Change-Id: I842fe59c026b68977e61a7ae0b5495c02803ad83
    Reviewed-on: https://gerrit.libreoffice.org/20435
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/writerfilter/qa/cppunittests/misc/misc.cxx b/writerfilter/qa/cppunittests/misc/misc.cxx
index 49e5e1b..522dc19 100644
--- a/writerfilter/qa/cppunittests/misc/misc.cxx
+++ b/writerfilter/qa/cppunittests/misc/misc.cxx
@@ -160,6 +160,26 @@ void WriterfilterMiscTest::testFieldParameters()
     CPPUNIT_ASSERT_EQUAL(OUString("foobar"), boost::get<2>(result)[1]);
     CPPUNIT_ASSERT_EQUAL(OUString("\\A"), boost::get<2>(result)[2]);
     CPPUNIT_ASSERT_EQUAL(OUString(), boost::get<2>(result)[3]);
+
+    for (auto prefix : {"#", "$", "%", "&", "'", "(", ")", "*", "+", ",",
+                        "-", ".", "/", ":", ";", "<", ">", "?", "@", "[",
+                        "]", "^", "_", "`", "{", "|", "}", "~"})
+    {
+        OUString test(OUString::createFromAscii(prefix) + OUString("PAGE"));
+        result = lcl_SplitFieldCommand(test + OUString(" "));
+        CPPUNIT_ASSERT_EQUAL(test, boost::get<0>(result));
+    }
+    result = lcl_SplitFieldCommand("\\PAGE ");
+    CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), boost::get<0>(result));
+    result = lcl_SplitFieldCommand("\\ PAGE ");
+    CPPUNIT_ASSERT_EQUAL(OUString("\\ "), boost::get<0>(result));
+    CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), boost::get<1>(result)[0]);
+    result = lcl_SplitFieldCommand("\\\\PAGE ");
+    CPPUNIT_ASSERT_EQUAL(OUString("\\PAGE"), boost::get<0>(result));
+    result = lcl_SplitFieldCommand("\"PAGE\" ");
+    CPPUNIT_ASSERT_EQUAL(OUString("PAGE"), boost::get<0>(result));
+    result = lcl_SplitFieldCommand("\"PAGE ");
+    CPPUNIT_ASSERT_EQUAL(OUString("PAGE "), boost::get<0>(result));
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(WriterfilterMiscTest);
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 8e079ea..ec4304b 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -2274,15 +2274,12 @@ static OUString lcl_ExtractToken(OUString const& rCommand,
     assert(rIndex == rCommand.getLength());
     if (bQuoted)
     {
+        // MS Word allows this, so just emit a debug message
         SAL_INFO("writerfilter.dmapper",
                     "field argument with unterminated quote");
-        return OUString();
-    }
-    else
-    {
-        rHaveToken = !token.isEmpty();
-        return token.makeStringAndClear();
     }
+    rHaveToken = !token.isEmpty();
+    return token.makeStringAndClear();
 }
 
 boost::tuple<OUString, std::vector<OUString>, std::vector<OUString> >
@@ -2292,10 +2289,13 @@ lcl_SplitFieldCommand(const OUString& rCommand)
     std::vector<OUString> arguments;
     std::vector<OUString> switches;
     sal_Int32 nStartIndex(0);
-    // tdf#54584: Field may be prepended by a backslash - skip it
+    // tdf#54584: Field may be prepended by a backslash
+    // This is not an escapement, but already escaped literal "\"
+    // MS Word allows this, so just skip it
     if ((rCommand.getLength() >= nStartIndex + 2) &&
-        (rCommand[nStartIndex] == '\\') &&
-        (rCommand[nStartIndex + 1] != '\\'))
+        (rCommand[nStartIndex] == L'\\') &&
+        (rCommand[nStartIndex + 1] != L'\\') &&
+        (rCommand[nStartIndex + 1] != L' '))
     {
         ++nStartIndex;
     }


More information about the Libreoffice-commits mailing list