diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2021-09-21 13:17:11 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2021-09-21 15:17:31 +0200 |
commit | 1d4f198f176cfb5816b76ad67b6c0df39419f0cb (patch) | |
tree | e482b221a237c776c49d8b7d2d09687b6fb33489 /sw/source/filter/ww8/docxattributeoutput.cxx | |
parent | 96ff90857a066da70b04684f71237056e12eddfe (diff) |
Fix splitting of "permission-for-group/-user:" strings
...that had been introduced in f5c266695a4a88da7db971a21915e2bbf758d48e
"tdf#66398 Parse and output permissions for DOCX using bookmarks":
For one, in DocxAttributeOutput::DoWritePermissionTagStart permissionIdAndName
was left empty in the permission-for-user case. This had already been addressed
for DocxAttributeOutput::DoWritePermissionTagEnd in
7f0b7410e84a222d8fbee7c4fadd3b40028a068d "permissionIdAndName is empty in
permission-for-user case". But from the calling code it looks like in both
functions that permission will always start with either "permission-for-group:"
or "permission-for-user:", so assert that rather than silently doing nothing if
the assumption is wrong.
For another, in both functions the code didn't take any precaution if
permissionIdAndName didn't contain a colon (which would cause undefined behavior
when OUString::copy is called with a negative count argument). Again, from the
calling code assume that permissionIdAndName will always contain a colon, and
assert that.
Change-Id: Ia7432413c138d47efbe8aec76f14c561ac241fb3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122387
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'sw/source/filter/ww8/docxattributeoutput.cxx')
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index c2aa3880ece0..5da71ff6f820 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -1794,6 +1794,7 @@ void DocxAttributeOutput::DoWritePermissionTagStart(const OUString & permission) if (permission.startsWith("permission-for-group:", &permissionIdAndName)) { const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + assert(sparatorIndex != -1); const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); const OUString permissionName = permissionIdAndName.copy(sparatorIndex + 1); @@ -1801,9 +1802,12 @@ void DocxAttributeOutput::DoWritePermissionTagStart(const OUString & permission) FSNS(XML_w, XML_id), BookmarkToWord(permissionId), FSNS(XML_w, XML_edGrp), BookmarkToWord(permissionName)); } - else // if (permission.startsWith("permission-for-user:", &permissionIdAndName)) + else { + auto const ok = permission.startsWith("permission-for-user:", &permissionIdAndName); + assert(ok); (void)ok; const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + assert(sparatorIndex != -1); const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); const OUString permissionName = permissionIdAndName.copy(sparatorIndex + 1); @@ -1825,15 +1829,16 @@ void DocxAttributeOutput::DoWritePermissionTagEnd(const OUString & permission) { OUString permissionIdAndName; - if (permission.startsWith("permission-for-group:", &permissionIdAndName) || - permission.startsWith("permission-for-user:", &permissionIdAndName)) - { - const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); - const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); + auto const ok = permission.startsWith("permission-for-group:", &permissionIdAndName) || + permission.startsWith("permission-for-user:", &permissionIdAndName); + assert(ok); (void)ok; - m_pSerializer->singleElementNS(XML_w, XML_permEnd, - FSNS(XML_w, XML_id), BookmarkToWord(permissionId)); - } + const sal_Int32 sparatorIndex = permissionIdAndName.indexOf(':'); + assert(sparatorIndex != -1); + const OUString permissionId = permissionIdAndName.copy(0, sparatorIndex); + + m_pSerializer->singleElementNS(XML_w, XML_permEnd, + FSNS(XML_w, XML_id), BookmarkToWord(permissionId)); } /// Write the start permissions |