summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qcollator_posix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text/qcollator_posix.cpp')
-rw-r--r--src/corelib/text/qcollator_posix.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/corelib/text/qcollator_posix.cpp b/src/corelib/text/qcollator_posix.cpp
index 54c700015b..5ed80c1b8e 100644
--- a/src/corelib/text/qcollator_posix.cpp
+++ b/src/corelib/text/qcollator_posix.cpp
@@ -69,13 +69,19 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const
if (d->isC()) {
std::copy(original.cbegin(), original.cend(), result.begin());
} else {
- size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
- if (size > size_t(result.size())) {
- result.resize(size+1);
- size = std::wcsxfrm(result.data(), original.constData(), string.size());
+ auto availableSizeIncludingNullTerminator = result.size();
+ size_t neededSizeExcludingNullTerminator = std::wcsxfrm(
+ result.data(), original.constData(), availableSizeIncludingNullTerminator);
+ if (neededSizeExcludingNullTerminator > size_t(availableSizeIncludingNullTerminator - 1)) {
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ availableSizeIncludingNullTerminator = result.size();
+ neededSizeExcludingNullTerminator = std::wcsxfrm(result.data(), original.constData(),
+ availableSizeIncludingNullTerminator);
+ Q_ASSERT(neededSizeExcludingNullTerminator
+ == size_t(availableSizeIncludingNullTerminator - 1));
}
- result.resize(size+1);
- result[size] = 0;
+ result.resize(neededSizeExcludingNullTerminator + 1);
+ result[neededSizeExcludingNullTerminator] = 0;
}
return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
}