Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1019)

Unified Diff: runtime/vm/symbols.cc

Issue 1326853003: - Do not access the first character in zero-length strings. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/coverage.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/symbols.cc
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index 69384d594dd3c6c38737bab2d00002f5f86c65a6..c827704d682d75f9f8a63d56c75a2e50595e3845 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -425,13 +425,15 @@ RawString* Symbols::FromConcatAll(
for (intptr_t i = 0; i < strs_length; i++) {
NoSafepointScope no_safepoint;
intptr_t str_len = lengths[i];
- const String& str = strs[i];
- ASSERT(str.IsOneByteString() || str.IsExternalOneByteString());
- const uint8_t* src_p = str.IsOneByteString() ?
- OneByteString::CharAddr(str, 0) :
- ExternalOneByteString::CharAddr(str, 0);
- memmove(buffer, src_p, str_len);
- buffer += str_len;
+ if (str_len > 0) {
+ const String& str = strs[i];
+ ASSERT(str.IsOneByteString() || str.IsExternalOneByteString());
+ const uint8_t* src_p = str.IsOneByteString() ?
+ OneByteString::CharAddr(str, 0) :
+ ExternalOneByteString::CharAddr(str, 0);
+ memmove(buffer, src_p, str_len);
+ buffer += str_len;
+ }
}
ASSERT(len_sum == buffer - orig_buffer);
return Symbols::FromLatin1(orig_buffer, len_sum);
@@ -441,22 +443,24 @@ RawString* Symbols::FromConcatAll(
for (intptr_t i = 0; i < strs_length; i++) {
NoSafepointScope no_safepoint;
intptr_t str_len = lengths[i];
- const String& str = strs[i];
- if (str.IsTwoByteString()) {
- memmove(buffer, TwoByteString::CharAddr(str, 0), str_len * 2);
- } else if (str.IsExternalTwoByteString()) {
- memmove(buffer, ExternalTwoByteString::CharAddr(str, 0), str_len * 2);
- } else {
- // One-byte to two-byte string copy.
- ASSERT(str.IsOneByteString() || str.IsExternalOneByteString());
- const uint8_t* src_p = str.IsOneByteString() ?
- OneByteString::CharAddr(str, 0) :
- ExternalOneByteString::CharAddr(str, 0);
- for (int n = 0; n < str_len; n++) {
- buffer[n] = src_p[n];
+ if (str_len > 0) {
+ const String& str = strs[i];
+ if (str.IsTwoByteString()) {
+ memmove(buffer, TwoByteString::CharAddr(str, 0), str_len * 2);
+ } else if (str.IsExternalTwoByteString()) {
+ memmove(buffer, ExternalTwoByteString::CharAddr(str, 0), str_len * 2);
+ } else {
+ // One-byte to two-byte string copy.
+ ASSERT(str.IsOneByteString() || str.IsExternalOneByteString());
+ const uint8_t* src_p = str.IsOneByteString() ?
+ OneByteString::CharAddr(str, 0) :
+ ExternalOneByteString::CharAddr(str, 0);
+ for (int n = 0; n < str_len; n++) {
+ buffer[n] = src_p[n];
+ }
}
+ buffer += str_len;
}
- buffer += str_len;
}
ASSERT(len_sum == buffer - orig_buffer);
return Symbols::FromUTF16(orig_buffer, len_sum);
« no previous file with comments | « runtime/vm/coverage.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698