]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix data race on runtime·maxstring
authorDmitriy Vyukov <dvyukov@google.com>
Tue, 12 Jul 2011 05:21:06 +0000 (01:21 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 12 Jul 2011 05:21:06 +0000 (01:21 -0400)
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

src/pkg/runtime/print.c
src/pkg/runtime/string.goc

index b8069aa393c9b68cefc009ae7f431ce3cbaed951..3ce7794957dc17b868f39be8ba72635ffdd22ae5 100644 (file)
@@ -320,7 +320,7 @@ runtime·printpointer(void *p)
 void
 runtime·printstring(String v)
 {
-       extern int32 runtime·maxstring;
+       extern uint32 runtime·maxstring;
 
        if(v.len > runtime·maxstring) {
                runtime·write(2, "[invalid string]", 16);
index b72aa937c33f2a69fa7d09bfe2e94a4591695c26..15b3459adaf72c7063e0092b022ad982886faa76 100644 (file)
@@ -32,19 +32,23 @@ runtime·findnullw(uint16 *s)
        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;
 }