The data race can lead to erroneous output of
"[invalid string]" instead of a string.
R=golang-dev
CC=golang-dev
https://golang.org/cl/
4678049
void
runtime·printstring(String v)
{
- extern int32 runtime·maxstring;
+ extern uint32 runtime·maxstring;
if(v.len > runtime·maxstring) {
runtime·write(2, "[invalid string]", 16);
return l;
}
-int32 runtime·maxstring = 256;
+uint32 runtime·maxstring = 256;
String
runtime·gostringsize(int32 l)
{
String s;
+ uint32 ms;
if(l == 0)
return runtime·emptystring;
s.str = runtime·mal(l+1); // leave room for NUL for C runtime (e.g., callers of getenv)
s.len = l;
- if(l > runtime·maxstring)
- runtime·maxstring = l;
+ for(;;) {
+ ms = runtime·maxstring;
+ if((uint32)l <= ms || runtime·cas(&runtime·maxstring, ms, (uint32)l))
+ break;
+ }
return s;
}