summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2023-12-18 17:44:41 +0300
committerXisco Fauli <xiscofauli@libreoffice.org>2023-12-19 16:26:28 +0100
commit7eac2d2fded789a3dd64b738d816ce0b6270decc (patch)
tree4a007a6ff2783f44592e703c5b10740cbf4c3217 /editeng
parent884802163a07064683b6b2637c0601692f507a18 (diff)
tdf#158703: return updated position from FnAddNonBrkSpace
The paragraph text may become shorter after the function succeeds, because it may remove arbitrary number of preceding spaces; since the position may then be used to access data in the string in the caller, we need to update it, to avoid use of old position (which may point beyond the string, and produce a crash; or it may point to a wrong position in it). Change-Id: Ib1b4b63cbd7150e0f69c97032e3410db7dadd4dc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160924 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com> (cherry picked from commit 1325d66a7f8657aaf9951a0664fbf14cca86905b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160934 Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org> Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160978
Diffstat (limited to 'editeng')
-rw-r--r--editeng/source/misc/svxacorr.cxx22
1 files changed, 13 insertions, 9 deletions
diff --git a/editeng/source/misc/svxacorr.cxx b/editeng/source/misc/svxacorr.cxx
index 318da6536df9..56228b2fbf05 100644
--- a/editeng/source/misc/svxacorr.cxx
+++ b/editeng/source/misc/svxacorr.cxx
@@ -669,12 +669,12 @@ bool SvxAutoCorrect::FnChgToEnEmDash(
}
// Add non-breaking space before specific punctuation marks in French text
-bool SvxAutoCorrect::FnAddNonBrkSpace(
+sal_Int32 SvxAutoCorrect::FnAddNonBrkSpace(
SvxAutoCorrDoc& rDoc, std::u16string_view rTxt,
sal_Int32 nEndPos,
LanguageType eLang, bool& io_bNbspRunNext )
{
- bool bRet = false;
+ sal_Int32 nRet = -1;
CharClass& rCC = GetCharClass( eLang );
@@ -708,7 +708,7 @@ bool SvxAutoCorrect::FnAddNonBrkSpace(
if (nIndex + nProtocolLen <= rTxt.size())
{
if (INetURLObject::CompareProtocolScheme(rTxt.substr(nIndex, nProtocolLen)) != INetProtocol::NotValid)
- return false;
+ return -1;
}
// Check the presence of "://" in the word
@@ -736,7 +736,7 @@ bool SvxAutoCorrect::FnAddNonBrkSpace(
if ( bHasSpace )
rDoc.Insert( nPos, OUString(cNonBreakingSpace) );
io_bNbspRunNext = true;
- bRet = true;
+ nRet = nPos;
}
else if ( chars.indexOf( cPrevChar ) != -1 )
io_bNbspRunNext = true;
@@ -750,12 +750,12 @@ bool SvxAutoCorrect::FnAddNonBrkSpace(
if ( cPrevChar == ':' && cMaybeSpaceChar == cNonBreakingSpace )
{
rDoc.Delete( nEndPos - 2, nEndPos - 1 );
- bRet = true;
+ nRet = nEndPos - 1;
}
}
}
- return bRet;
+ return nRet;
}
// URL recognition
@@ -1502,10 +1502,14 @@ void SvxAutoCorrect::DoAutoCorrect( SvxAutoCorrDoc& rDoc, const OUString& rTxt,
// Hardspaces autocorrection
if ( IsAutoCorrFlag( ACFlags::AddNonBrkSpace ) )
{
- if ( NeedsHardspaceAutocorr( cChar ) &&
- FnAddNonBrkSpace( rDoc, rTxt, nInsPos, GetDocLanguage( rDoc, nInsPos ), io_bNbspRunNext ) )
+ // WARNING ATTENTION: rTxt is an alias of the text node's OUString
+ // and its length may change (even become shorter) if FnAddNonBrkSpace succeeds!
+ sal_Int32 nUpdatedPos = -1;
+ if (NeedsHardspaceAutocorr(cChar))
+ nUpdatedPos = FnAddNonBrkSpace( rDoc, rTxt, nInsPos, GetDocLanguage( rDoc, nInsPos ), io_bNbspRunNext );
+ if (nUpdatedPos >= 0)
{
- ;
+ nInsPos = nUpdatedPos;
}
else if ( bIsNextRun && !IsAutoCorrectChar( cChar ) )
{