Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core
diff options
context:
space:
mode:
authorFalseIlyu <ilyulemail@gmail.com>2025-05-08 18:01:55 +0200
committerFalseIlyu <ilyulemail@gmail.com>2025-05-16 10:25:41 +0200
commit14109a5caa4a4c9b54e3d2749d2212d519951f00 (patch)
treea4afa5aaba57312af0f34155a231b5452f173968 /source/core
parentda281a0c5286014f952b5a8ce2f346f99c114089 (diff)
UB trying to dereference end of string view
Diffstat (limited to 'source/core')
-rw-r--r--source/core/StarStringView.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/source/core/StarStringView.cpp b/source/core/StarStringView.cpp
index 2bc9cd5..535d350 100644
--- a/source/core/StarStringView.cpp
+++ b/source/core/StarStringView.cpp
@@ -113,8 +113,11 @@ bool StringView::beginsWith(StringView beg, CaseSensitivity cs) const {
auto it = begin();
auto itEnd = end();
for (size_t i = 0; i != begSize; ++i)
- if (it++ == itEnd)
+ {
+ if (it == itEnd)
return false;
+ it++;
+ }
return compare(0, begSize, beg, 0, NPos, cs) == 0;
}
@@ -352,18 +355,20 @@ StringView StringView::substr(size_t position, size_t n) const {
auto it = begin();
for (size_t i = 0; i != position; ++i) {
- if (it++ == itEnd)
+ if (it == itEnd)
throw OutOfRangeException(strf("out of range in StringView::substr({}, {})", position, n));
+ it++;
}
- const char* start = &*it.base();
+ const auto itStart = it;
for (size_t i = 0; i != n; ++i) {
- if (it++ == itEnd)
- return StringView(start, &*it.base() - start - 1);
+ if (it == itEnd)
+ break;
+ ++it;
}
- return StringView(start, &*it.base() - start);
+ return StringView(&*itStart.base(), it.base() - itStart.base());
}
int StringView::compare(size_t selfOffset, size_t selfLen, StringView other,