summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libgomp/config/linux/affinity.c35
-rw-r--r--libgomp/config/rtems/proc.c11
-rw-r--r--libgomp/env.c46
3 files changed, 55 insertions, 37 deletions
diff --git a/libgomp/config/linux/affinity.c b/libgomp/config/linux/affinity.c
index 69e72a8d141..e11906abec4 100644
--- a/libgomp/config/linux/affinity.c
+++ b/libgomp/config/linux/affinity.c
@@ -251,7 +251,7 @@ gomp_affinity_find_last_cache_level (char *name, size_t prefix_len,
char *p;
errno = 0;
val = strtoul (line, &p, 10);
- if (!errno && val >= maxval)
+ if (!errno && p > line && val >= maxval)
{
ret = l;
maxval = val;
@@ -303,7 +303,7 @@ gomp_affinity_init_level_1 (int level, int this_level, unsigned long count,
}
if (getline (&line, &linelen, f) > 0)
{
- char *p = line;
+ char *p = line, *end;
void *pl = gomp_places_list[gomp_places_list_len];
if (level == this_level)
gomp_affinity_init_place (pl);
@@ -311,16 +311,18 @@ gomp_affinity_init_level_1 (int level, int this_level, unsigned long count,
{
unsigned long first, last;
errno = 0;
- first = strtoul (p, &p, 10);
- if (errno)
+ first = strtoul (p, &end, 10);
+ if (errno || end == p)
break;
+ p = end;
last = first;
if (*p == '-')
{
errno = 0;
- last = strtoul (p + 1, &p, 10);
- if (errno || last < first)
+ last = strtoul (p + 1, &end, 10);
+ if (errno || end == p + 1 || last < first)
break;
+ p = end;
}
for (; first <= last; first++)
if (!CPU_ISSET_S (first, gomp_cpuset_size, copy))
@@ -383,18 +385,21 @@ gomp_affinity_init_numa_domains (unsigned long count, cpu_set_t *copy,
while (*q && *q != '\n' && gomp_places_list_len < count)
{
unsigned long nfirst, nlast;
+ char *end;
errno = 0;
- nfirst = strtoul (q, &q, 10);
- if (errno)
+ nfirst = strtoul (q, &end, 10);
+ if (errno || end == q)
break;
+ q = end;
nlast = nfirst;
if (*q == '-')
{
errno = 0;
- nlast = strtoul (q + 1, &q, 10);
- if (errno || nlast < nfirst)
+ nlast = strtoul (q + 1, &end, 10);
+ if (errno || end == q + 1 || nlast < nfirst)
break;
+ q = end;
}
for (; nfirst <= nlast; nfirst++)
{
@@ -413,16 +418,18 @@ gomp_affinity_init_numa_domains (unsigned long count, cpu_set_t *copy,
bool seen = false;
errno = 0;
- first = strtoul (p, &p, 10);
- if (errno)
+ first = strtoul (p, &end, 10);
+ if (errno || end == p)
break;
+ p = end;
last = first;
if (*p == '-')
{
errno = 0;
- last = strtoul (p + 1, &p, 10);
- if (errno || last < first)
+ last = strtoul (p + 1, &end, 10);
+ if (errno || end == p + 1 || last < first)
break;
+ p = end;
}
for (; first <= last; first++)
{
diff --git a/libgomp/config/rtems/proc.c b/libgomp/config/rtems/proc.c
index 97b9e2faa87..ad40de4c381 100644
--- a/libgomp/config/rtems/proc.c
+++ b/libgomp/config/rtems/proc.c
@@ -78,22 +78,25 @@ parse_thread_pools (char *env, unsigned long *count, unsigned long *priority,
{
size_t len;
int i;
+ char *end;
if (*env == ':')
++env;
errno = 0;
- *count = strtoul (env, &env, 10);
- if (errno != 0)
+ *count = strtoul (env, &end, 10);
+ if (errno != 0 || end == env)
gomp_fatal ("Invalid thread pool count");
+ env = end;
if (*env == '$')
{
++env;
errno = 0;
- *priority = strtoul (env, &env, 10);
- if (errno != 0)
+ *priority = strtoul (env, &end, 10);
+ if (errno != 0 || end == env)
gomp_fatal ("Invalid thread pool priority");
+ env = end;
}
else
*priority = -1;
diff --git a/libgomp/env.c b/libgomp/env.c
index 7eb895f6b69..b0acacb5783 100644
--- a/libgomp/env.c
+++ b/libgomp/env.c
@@ -183,7 +183,7 @@ parse_schedule (void)
errno = 0;
value = strtoul (env, &end, 10);
- if (errno)
+ if (errno || end == env)
goto invalid;
while (isspace ((unsigned char) *end))
@@ -232,7 +232,7 @@ parse_unsigned_long_1 (const char *name, unsigned long *pvalue, bool allow_zero,
errno = 0;
value = strtoul (env, &end, 10);
- if (errno || (long) value <= 0 - allow_zero)
+ if (errno || end == env || (long) value <= 0 - allow_zero)
goto invalid;
while (isspace ((unsigned char) *end))
@@ -570,6 +570,7 @@ parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
unsigned long this_num, this_len = 1;
long this_stride = 1;
bool this_negate = (*env == '!');
+ char *end;
if (this_negate)
{
if (gomp_places_list)
@@ -580,9 +581,10 @@ parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
}
errno = 0;
- this_num = strtoul (env, &env, 10);
- if (errno)
+ this_num = strtoul (env, &end, 10);
+ if (errno || end == env)
return false;
+ env = end;
while (isspace ((unsigned char) *env))
++env;
if (*env == ':')
@@ -602,9 +604,10 @@ parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
while (isspace ((unsigned char) *env))
++env;
errno = 0;
- this_stride = strtol (env, &env, 10);
- if (errno)
+ this_stride = strtol (env, &end, 10);
+ if (errno || end == env)
return false;
+ env = end;
while (isspace ((unsigned char) *env))
++env;
}
@@ -636,6 +639,7 @@ parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
++env;
if (*env == ':')
{
+ char *end;
++env;
while (isspace ((unsigned char) *env))
++env;
@@ -651,9 +655,10 @@ parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
while (isspace ((unsigned char) *env))
++env;
errno = 0;
- stride = strtol (env, &env, 10);
- if (errno)
+ stride = strtol (env, &end, 10);
+ if (errno || end == env)
return false;
+ env = end;
while (isspace ((unsigned char) *env))
++env;
}
@@ -720,7 +725,7 @@ parse_places_var (const char *name, bool ignore)
errno = 0;
count = strtoul (env, &end, 10);
- if (errno)
+ if (errno || end == env)
goto invalid;
env = end;
while (isspace ((unsigned char) *env))
@@ -859,7 +864,7 @@ parse_stacksize (const char *name, unsigned long *pvalue)
errno = 0;
value = strtoul (env, &end, 10);
- if (errno)
+ if (errno || end == env)
goto invalid;
while (isspace ((unsigned char) *end))
@@ -928,7 +933,7 @@ parse_spincount (const char *name, unsigned long long *pvalue)
errno = 0;
value = strtoull (env, &end, 10);
- if (errno)
+ if (errno || end == env)
goto invalid;
while (isspace ((unsigned char) *end))
@@ -1080,7 +1085,7 @@ parse_affinity (bool ignore)
errno = 0;
cpu_beg = strtoul (env, &end, 0);
- if (errno || cpu_beg >= 65536)
+ if (errno || end == env || cpu_beg >= 65536)
goto invalid;
cpu_end = cpu_beg;
cpu_stride = 1;
@@ -1090,7 +1095,7 @@ parse_affinity (bool ignore)
{
errno = 0;
cpu_end = strtoul (++env, &end, 0);
- if (errno || cpu_end >= 65536 || cpu_end < cpu_beg)
+ if (errno || end == env || cpu_end >= 65536 || cpu_end < cpu_beg)
goto invalid;
env = end;
@@ -1202,27 +1207,30 @@ parse_gomp_openacc_dim (void)
/* The syntax is the same as for the -fopenacc-dim compilation option. */
const char *var_name = "GOMP_OPENACC_DIM";
const char *env_var = getenv (var_name);
+ const char *pos = env_var;
+ int i;
+
if (!env_var)
return;
- const char *pos = env_var;
- int i;
for (i = 0; *pos && i != GOMP_DIM_MAX; i++)
{
+ char *eptr;
+ long val;
+
if (i && *pos++ != ':')
break;
if (*pos == ':')
continue;
- const char *eptr;
errno = 0;
- long val = strtol (pos, (char **)&eptr, 10);
- if (errno || val < 0 || (unsigned)val != val)
+ val = strtol (pos, &eptr, 10);
+ if (errno || eptr != pos || val < 0 || (unsigned)val != val)
break;
goacc_default_dims[i] = (int)val;
- pos = eptr;
+ pos = (const char *) eptr;
}
}