aboutsummaryrefslogtreecommitdiff
path: root/libgo/runtime/runtime.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/runtime/runtime.c')
-rw-r--r--libgo/runtime/runtime.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/libgo/runtime/runtime.c b/libgo/runtime/runtime.c
index e332035..be7ccbd 100644
--- a/libgo/runtime/runtime.c
+++ b/libgo/runtime/runtime.c
@@ -35,6 +35,7 @@ extern volatile intgo runtime_MemProfileRate
int32
runtime_gotraceback(bool *crash)
{
+ String s;
const byte *p;
uint32 x;
@@ -44,15 +45,14 @@ runtime_gotraceback(bool *crash)
return runtime_m()->traceback;
x = runtime_atomicload(&traceback_cache);
if(x == ~(uint32)0) {
- p = runtime_getenv("GOTRACEBACK");
- if(p == nil)
- p = (const byte*)"";
- if(p[0] == '\0')
+ s = runtime_getenv("GOTRACEBACK");
+ p = s.str;
+ if(s.len == 0)
x = 1<<1;
- else if(runtime_strcmp((const char *)p, "crash") == 0)
+ else if(s.len == 5 && runtime_strcmp((const char *)p, "crash") == 0)
x = (2<<1) | 1;
else
- x = runtime_atoi(p)<<1;
+ x = runtime_atoi(p, s.len)<<1;
runtime_atomicstore(&traceback_cache, x);
}
if(crash != nil)
@@ -136,13 +136,15 @@ os_runtime_args()
}
int32
-runtime_atoi(const byte *p)
+runtime_atoi(const byte *p, intgo len)
{
int32 n;
n = 0;
- while('0' <= *p && *p <= '9')
+ while(len > 0 && '0' <= *p && *p <= '9') {
n = n*10 + *p++ - '0';
+ len--;
+ }
return n;
}
@@ -339,7 +341,9 @@ static struct {
void
runtime_parsedebugvars(void)
{
- const byte *p;
+ String s;
+ const byte *p, *pn;
+ intgo len;
intgo i, n;
bool tmp;
@@ -352,24 +356,27 @@ runtime_parsedebugvars(void)
traceback_cache = ~(uint32)0;
runtime_gotraceback(&tmp);
- p = runtime_getenv("GODEBUG");
- if(p == nil)
+ s = runtime_getenv("GODEBUG");
+ if(s.len == 0)
return;
+ p = s.str;
+ len = s.len;
for(;;) {
for(i=0; i<(intgo)nelem(dbgvar); i++) {
n = runtime_findnull((const byte*)dbgvar[i].name);
- if(runtime_mcmp(p, "memprofilerate", n) == 0 && p[n] == '=')
+ if(len > n && runtime_mcmp(p, "memprofilerate", n) == 0 && p[n] == '=')
// Set the MemProfileRate directly since it
// is an int, not int32, and should only lbe
// set here if specified by GODEBUG
- runtime_MemProfileRate = runtime_atoi(p+n+1);
- else if(runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=')
- *dbgvar[i].value = runtime_atoi(p+n+1);
+ runtime_MemProfileRate = runtime_atoi(p+n+1, len-(n+1));
+ else if(len > n && runtime_mcmp(p, dbgvar[i].name, n) == 0 && p[n] == '=')
+ *dbgvar[i].value = runtime_atoi(p+n+1, len-(n+1));
}
- p = (const byte *)runtime_strstr((const char *)p, ",");
- if(p == nil)
+ pn = (const byte *)runtime_strstr((const char *)p, ",");
+ if(pn == nil || pn - p >= len)
break;
- p++;
+ len -= (pn - p) - 1;
+ p = pn + 1;
}
}