sw/source/filter/ww8/docxattributeoutput.cxx | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-)
New commits: commit 1d4f198f176cfb5816b76ad67b6c0df39419f0cb Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Tue Sep 21 13:17:11 2021 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Tue Sep 21 15:17:31 2021 +0200 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 <sberg...@redhat.com> 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