about summary refs log tree commit diff
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);
+}