Commit 22f1a037 by Tom de Vries Committed by Tom de Vries

Use secure_getenv for GOMP_DEBUG

2017-06-27  Tom de Vries  <tom@codesourcery.com>

	* env.c (parse_unsigned_long_1): Factor out of ...
	(parse_unsigned_long): ... here.
	(parse_int_1): Factor out of ...
	(parse_int): ... here.
	(parse_int_secure): New function.
	(initialize_env): Use parse_int_secure for GOMP_DEBUG.
	* secure_getenv.h: Factor out of ...
	* plugin/plugin-hsa.c: ... here.
	* testsuite/libgomp.oacc-c-c++-common/gomp-debug-env.c: New test.

From-SVN: r249694
parent 5fee5eca
2017-06-27 Tom de Vries <tom@codesourcery.com>
* env.c (parse_unsigned_long_1): Factor out of ...
(parse_unsigned_long): ... here.
(parse_int_1): Factor out of ...
(parse_int): ... here.
(parse_int_secure): New function.
(initialize_env): Use parse_int_secure for GOMP_DEBUG.
* secure_getenv.h: Factor out of ...
* plugin/plugin-hsa.c: ... here.
* testsuite/libgomp.oacc-c-c++-common/gomp-debug-env.c: New test.
2017-06-21 Jakub Jelinek <jakub@redhat.com> 2017-06-21 Jakub Jelinek <jakub@redhat.com>
PR c++/81130 PR c++/81130
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
/* This file defines the OpenMP internal control variables and arranges /* This file defines the OpenMP internal control variables and arranges
for them to be initialized from environment variables at startup. */ for them to be initialized from environment variables at startup. */
#define _GNU_SOURCE
#include "libgomp.h" #include "libgomp.h"
#include "gomp-constants.h" #include "gomp-constants.h"
#include <limits.h> #include <limits.h>
...@@ -58,6 +59,8 @@ ...@@ -58,6 +59,8 @@
#endif #endif
#endif /* LIBGOMP_OFFLOADED_ONLY */ #endif /* LIBGOMP_OFFLOADED_ONLY */
#include "secure_getenv.h"
struct gomp_task_icv gomp_global_icv = { struct gomp_task_icv gomp_global_icv = {
.nthreads_var = 1, .nthreads_var = 1,
.thread_limit_var = UINT_MAX, .thread_limit_var = UINT_MAX,
...@@ -171,15 +174,17 @@ parse_schedule (void) ...@@ -171,15 +174,17 @@ parse_schedule (void)
} }
/* Parse an unsigned long environment variable. Return true if one was /* Parse an unsigned long environment variable. Return true if one was
present and it was successfully parsed. */ present and it was successfully parsed. If SECURE, use secure_getenv to the
environment variable. */
static bool static bool
parse_unsigned_long (const char *name, unsigned long *pvalue, bool allow_zero) parse_unsigned_long_1 (const char *name, unsigned long *pvalue, bool allow_zero,
bool secure)
{ {
char *env, *end; char *env, *end;
unsigned long value; unsigned long value;
env = getenv (name); env = (secure ? secure_getenv (name) : getenv (name));
if (env == NULL) if (env == NULL)
return false; return false;
...@@ -206,14 +211,23 @@ parse_unsigned_long (const char *name, unsigned long *pvalue, bool allow_zero) ...@@ -206,14 +211,23 @@ parse_unsigned_long (const char *name, unsigned long *pvalue, bool allow_zero)
return false; return false;
} }
/* As parse_unsigned_long_1, but always use getenv. */
static bool
parse_unsigned_long (const char *name, unsigned long *pvalue, bool allow_zero)
{
return parse_unsigned_long_1 (name, pvalue, allow_zero, false);
}
/* Parse a positive int environment variable. Return true if one was /* Parse a positive int environment variable. Return true if one was
present and it was successfully parsed. */ present and it was successfully parsed. If SECURE, use secure_getenv to the
environment variable. */
static bool static bool
parse_int (const char *name, int *pvalue, bool allow_zero) parse_int_1 (const char *name, int *pvalue, bool allow_zero, bool secure)
{ {
unsigned long value; unsigned long value;
if (!parse_unsigned_long (name, &value, allow_zero)) if (!parse_unsigned_long_1 (name, &value, allow_zero, secure))
return false; return false;
if (value > INT_MAX) if (value > INT_MAX)
{ {
...@@ -224,6 +238,22 @@ parse_int (const char *name, int *pvalue, bool allow_zero) ...@@ -224,6 +238,22 @@ parse_int (const char *name, int *pvalue, bool allow_zero)
return true; return true;
} }
/* As parse_int_1, but use getenv. */
static bool
parse_int (const char *name, int *pvalue, bool allow_zero)
{
return parse_int_1 (name, pvalue, allow_zero, false);
}
/* As parse_int_1, but use getenv_secure. */
static bool
parse_int_secure (const char *name, int *pvalue, bool allow_zero)
{
return parse_int_1 (name, pvalue, allow_zero, true);
}
/* Parse an unsigned long list environment variable. Return true if one was /* Parse an unsigned long list environment variable. Return true if one was
present and it was successfully parsed. */ present and it was successfully parsed. */
...@@ -1207,7 +1237,7 @@ initialize_env (void) ...@@ -1207,7 +1237,7 @@ initialize_env (void)
gomp_global_icv.thread_limit_var gomp_global_icv.thread_limit_var
= thread_limit_var > INT_MAX ? UINT_MAX : thread_limit_var; = thread_limit_var > INT_MAX ? UINT_MAX : thread_limit_var;
} }
parse_int ("GOMP_DEBUG", &gomp_debug_var, true); parse_int_secure ("GOMP_DEBUG", &gomp_debug_var, true);
#ifndef HAVE_SYNC_BUILTINS #ifndef HAVE_SYNC_BUILTINS
gomp_mutex_init (&gomp_managed_threads_lock); gomp_mutex_init (&gomp_managed_threads_lock);
#endif #endif
......
...@@ -39,32 +39,7 @@ ...@@ -39,32 +39,7 @@
#include <dlfcn.h> #include <dlfcn.h>
#include "libgomp-plugin.h" #include "libgomp-plugin.h"
#include "gomp-constants.h" #include "gomp-constants.h"
#include "secure-getenv.h"
/* Secure getenv() which returns NULL if running as SUID/SGID. */
#ifndef HAVE_SECURE_GETENV
#ifdef HAVE___SECURE_GETENV
#define secure_getenv __secure_getenv
#elif defined (HAVE_UNISTD_H) && defined(HAVE_GETUID) && defined(HAVE_GETEUID) \
&& defined(HAVE_GETGID) && defined(HAVE_GETEGID)
#include <unistd.h>
/* Implementation of secure_getenv() for targets where it is not provided but
we have at least means to test real and effective IDs. */
static char *
secure_getenv (const char *name)
{
if ((getuid () == geteuid ()) && (getgid () == getegid ()))
return getenv (name);
else
return NULL;
}
#else
#define secure_getenv getenv
#endif
#endif
/* As an HSA runtime is dlopened, following structure defines function /* As an HSA runtime is dlopened, following structure defines function
pointers utilized by the HSA plug-in. */ pointers utilized by the HSA plug-in. */
......
/* Copyright (C) 2017 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SECURE_GETENV_H
#define _SECURE_GETENV_H 1
/* Secure getenv() which returns NULL if running as SUID/SGID. */
#ifndef HAVE_SECURE_GETENV
#if defined (HAVE_UNISTD_H) && defined (HAVE_GETUID) \
&& defined (HAVE_GETEUID) && defined (HAVE_GETGID) \
&& defined (HAVE_GETEGID)
#include <unistd.h>
#if SUPPORTS_WEAKREF && defined (HAVE___SECURE_GETENV)
static char* weak_secure_getenv (const char*)
__attribute__((__weakref__("__secure_getenv")));
#endif
/* Implementation of secure_getenv() for targets where it is not provided but
we have at least means to test real and effective IDs. */
static inline char *
secure_getenv (const char *name)
{
#if SUPPORTS_WEAKREF && defined (HAVE___SECURE_GETENV)
if (weak_secure_getenv)
return weak_secure_getenv (name);
#endif
if ((getuid () == geteuid ()) && (getgid () == getegid ()))
return getenv (name);
else
return NULL;
}
#else
#define secure_getenv getenv
#endif
#endif
#endif /* _SECURE_GETENV_H. */
/* { dg-do run } */
/* { dg-set-target-env-var GOMP_DEBUG "1" } */
/* Check that GOMP_DEBUG=1 triggers some output. */
int
main (void)
{
#pragma acc parallel
;
}
/* { dg-output "GOACC_parallel_keyed" } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment