* elf/rtld.c (process_envvars): Place output files for profiling

in SUID binaries in /var/profile.

	* elf/dl-load.c (_dl_map_object): Don't look in cache for
	preloading in SUID binaries.

	* elf/dl-profile.c (_dl_start_profile): Open the output file with
	O_NOFOLLOW if possible.

	* sysdeps/generic/segfault.c (install_handler): Check output file
	name with access().
This commit is contained in:
Andreas Jaeger 2001-01-10 16:52:19 +00:00
parent 36b04d7a19
commit 18c5126084
4 changed files with 13 additions and 8 deletions

View File

@ -1,5 +1,5 @@
/* Map in a shared object's segments from the file.
Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998, 1999, 2001 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
@ -1338,7 +1338,7 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
if (fd == -1 && env_path_list != NULL)
fd = open_path (name, namelen, preloaded, env_path_list, &realname);
if (fd == -1)
if (fd == -1 && (! preloaded || ! __libc_enable_secure))
{
/* Check the list of libraries in the file /etc/ld.so.cache,
for compatibility with Linux's ldconfig program. */

View File

@ -1,5 +1,5 @@
/* Profiling of shared libraries.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
Based on the BSD mcount implementation.
@ -263,7 +263,12 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
*cp++ = '/';
__stpcpy (__stpcpy (cp, _dl_profile), ".profile");
fd = __open (filename, O_RDWR | O_CREAT, 0666);
#ifdef O_NOFOLLOW
# define EXTRA_FLAGS | O_NOFOLLOW
#else
# define EXTRA_FLAGS
#endif
fd = __open (filename, O_RDWR | O_CREAT EXTRA_FLAGS, 0666);
if (fd == -1)
{
/* We cannot write the profiling data so don't do anything. */

View File

@ -1,5 +1,5 @@
/* Run time dynamic linker.
Copyright (C) 1995-1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1995-1999, 2000, 2001 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
@ -1273,7 +1273,7 @@ process_envvars (enum mode *modep, int *lazyp)
char *debug_output = NULL;
/* This is the default place for profiling data file. */
_dl_profile_output = "/var/tmp";
_dl_profile_output = __libc_enable_secure ? "/var/profile" : "/var/tmp";
while ((envline = _dl_next_ld_env_entry (&runp)) != NULL)
{

View File

@ -1,5 +1,5 @@
/* Catch segmentation faults and print backtrace.
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -236,6 +236,6 @@ install_handler (void)
/* Preserve the output file name if there is any given. */
name = getenv ("SEGFAULT_OUTPUT_NAME");
if (name != NULL && name[0] != '\0')
if (name != NULL && name[0] != '\0' && access (name, R_OK | W_OK) == 0)
fname = __strdup (name);
}