summaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/Makefile8
-rw-r--r--stdlib/canonicalize.c20
-rw-r--r--stdlib/secure-getenv.c30
3 files changed, 42 insertions, 16 deletions
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 9d5744fc78..eadcd40cee 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -12,9 +12,9 @@
# Library General Public License for more details.
# You should have received a copy of the GNU Library General Public
-# License along with the GNU C Library; see the file COPYING.LIB. If
-# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-# Cambridge, MA 02139, USA.
+# License along with the GNU C Library; see the file COPYING.LIB. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
#
# Makefile for stdlib routines
@@ -27,7 +27,7 @@ routines := \
atof atoi atol \
abort \
bsearch qsort msort \
- getenv putenv setenv \
+ getenv putenv setenv secure-getenv \
exit on_exit atexit \
abs labs llabs \
div ldiv lldiv \
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index 8c0074a11c..0985e250b8 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -53,21 +53,14 @@ canonicalize (const char *name, char *resolved)
path_max = 1024;
#endif
- rpath = resolved;
+ rpath = resolved ? __alloca (path_max) : malloc (path_max);
rpath_limit = rpath + path_max;
- if (!resolved)
- rpath = malloc (path_max);
if (name[0] != '/')
{
- /* We don't write to RPATH directly since the application and
- the library might disagree about the value for PATH_MAX. */
- char tmpbuf[path_max];
-
if (!getcwd (rpath, path_max))
goto error;
-
- dest = __stpcpy (rpath, tmpbuf);
+ dest = strchr (rpath, '\0');
}
else
{
@@ -128,7 +121,7 @@ canonicalize (const char *name, char *resolved)
if (S_ISLNK (st.st_mode))
{
- char * buf = __alloca(path_max);
+ char *buf = __alloca (path_max);
if (++num_links > MAXSYMLINKS)
{
@@ -169,10 +162,13 @@ canonicalize (const char *name, char *resolved)
if (dest > rpath + 1 && dest[-1] == '/')
--dest;
*dest = '\0';
- return rpath;
+
+ return resolved ? strcpy (resolved, rpath) : rpath;
error:
- if (!resolved)
+ if (resolved)
+ strcpy (resolved, rpath);
+ else
free (rpath);
return NULL;
}
diff --git a/stdlib/secure-getenv.c b/stdlib/secure-getenv.c
new file mode 100644
index 0000000000..f4dc43cc85
--- /dev/null
+++ b/stdlib/secure-getenv.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1991, 1992, 1994, 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Some programs and especially the libc itself have to be careful
+ what values to accept from the environment. This special version
+ checks for SUID or SGID first before doing any work. */
+char *
+__secure_getenv (name)
+ const char *name;
+{
+ return __libc_enable_secure ? NULL : getenv (name);
+}