runtime: always initialize str field in __go_string_slice result
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 18 Sep 2017 22:29:45 +0000 (22:29 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 18 Sep 2017 22:29:45 +0000 (22:29 +0000)
    Reviewed-on: https://go-review.googlesource.com/64110

From-SVN: r252953

gcc/go/gofrontend/MERGE
libgo/runtime/go-strslice.c

index 4081aa946b68fcefe8bf8c4bf446aaced390d830..27bcb6e252df6ce836eeca43f1cace60dfd7d964 100644 (file)
@@ -1,4 +1,4 @@
-abe58fdc529378706d65d6b22e4871646eb9023e
+be69546afcac182cc93c569bc96665f0ef72d66a
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 0e897812be624f656a91c37f43d2fc970f595f37..d51c24937811583a7fefafe22b2d2eb1396a0b11 100644 (file)
@@ -18,10 +18,13 @@ __go_string_slice (String s, intgo start, intgo end)
   if (start > len || end < start || end > len)
     runtime_panicstring ("string index out of bounds");
   ret.len = end - start;
-  // If the length of the new string is zero, don't adjust the str
-  // field.  This ensures that we don't create a pointer to the next
-  // memory block, and thus keep it live unnecessarily.
-  if (ret.len > 0)
+  // If the length of the new string is zero, the str field doesn't
+  // matter, so just set it to nil.  This avoids the problem of
+  // s.str + start pointing just past the end of the string,
+  // which may keep the next memory block alive unnecessarily.
+  if (ret.len == 0)
+    ret.str = nil;
+  else
     ret.str = s.str + start;
   return ret;
 }