yann@1: 2001-01-08 Ulrich Drepper yann@1: yann@1: * elf/rtld.c (process_envvars): Place output files for profiling yann@1: in SUID binaries in /var/profile. yann@1: yann@1: * elf/dl-load.c (_dl_map_object): Don't look in cache for yann@1: preloading in SUID binaries. yann@1: yann@1: * elf/dl-profile.c (_dl_start_profile): Open the output file with yann@1: O_NOFOLLOW if possible. yann@1: yann@1: * sysdeps/generic/segfault.c (install_handler): Check output file yann@1: name with access(). yann@1: yann@1: --- libc/elf/rtld.c 2000/03/15 05:42:01 1.148.2.7 yann@1: +++ libc/elf/rtld.c 2001/01/10 07:45:19 yann@1: @@ -1273,7 +1273,7 @@ yann@1: char *debug_output = NULL; yann@1: yann@1: /* This is the default place for profiling data file. */ yann@1: - _dl_profile_output = "/var/tmp"; yann@1: + _dl_profile_output = __libc_enable_secure ? "/var/profile" : "/var/tmp"; yann@1: yann@1: while ((envline = _dl_next_ld_env_entry (&runp)) != NULL) yann@1: { yann@1: --- libc/elf/dl-load.c 1999/11/20 02:26:38 1.103.2.5 yann@1: +++ libc/elf/dl-load.c 2001/01/10 07:45:20 yann@1: @@ -1338,7 +1338,7 @@ yann@1: if (fd == -1 && env_path_list != NULL) yann@1: fd = open_path (name, namelen, preloaded, env_path_list, &realname); yann@1: yann@1: - if (fd == -1) yann@1: + if (fd == -1 && (! preloaded || ! __libc_enable_secure)) yann@1: { yann@1: /* Check the list of libraries in the file /etc/ld.so.cache, yann@1: for compatibility with Linux's ldconfig program. */ yann@1: --- libc/elf/dl-profile.c 1998/06/07 13:35:48 1.14 yann@1: +++ libc/elf/dl-profile.c 2001/01/10 07:45:21 yann@1: @@ -263,7 +263,12 @@ yann@1: *cp++ = '/'; yann@1: __stpcpy (__stpcpy (cp, _dl_profile), ".profile"); yann@1: yann@1: - fd = __open (filename, O_RDWR | O_CREAT, 0666); yann@1: +#ifdef O_NOFOLLOW yann@1: +# define EXTRA_FLAGS | O_NOFOLLOW yann@1: +#else yann@1: +# define EXTRA_FLAGS yann@1: +#endif yann@1: + fd = __open (filename, O_RDWR | O_CREAT EXTRA_FLAGS, 0666); yann@1: if (fd == -1) yann@1: { yann@1: /* We cannot write the profiling data so don't do anything. */ yann@1: --- libc/sysdeps/generic/segfault.c 2000/03/21 04:53:40 1.10.2.2 yann@1: +++ libc/sysdeps/generic/segfault.c 2001/01/10 07:45:22 yann@1: @@ -236,6 +236,7 @@ yann@1: yann@1: /* Preserve the output file name if there is any given. */ yann@1: name = getenv ("SEGFAULT_OUTPUT_NAME"); yann@1: - if (name != NULL && name[0] != '\0') yann@1: + if (name != NULL && name[0] != '\0' yann@1: + && (!__libc_enable_secure || access (name, R_OK | W_OK) == 0)) yann@1: fname = __strdup (name); yann@1: } yann@1: yann@1: --- libc/sysdeps/unix/sysv/linux/i386/dl-librecon.h.jj Wed Feb 24 23:01:58 1999 yann@1: +++ libc/sysdeps/unix/sysv/linux/i386/dl-librecon.h Mon Jan 15 04:30:57 2001 yann@1: @@ -49,13 +49,17 @@ yann@1: /* Recognizing extra environment variables. */ yann@1: #define EXTRA_LD_ENVVARS \ yann@1: case 15: \ yann@1: - if (memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0) \ yann@1: + if (!__libc_enable_secure \ yann@1: + && memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0) \ yann@1: { \ yann@1: _dl_correct_cache_id = envline[19] == '5' ? 2 : 3; \ yann@1: break; \ yann@1: } yann@1: yann@1: /* Extra unsecure variables. */ yann@1: -#define EXTRA_UNSECURE_ENVVARS "LD_AOUT_LIBRARY_PATH", "LD_AOUT_PRELOAD" yann@1: +#define EXTRA_UNSECURE_ENVVARS \ yann@1: + "LD_AOUT_LIBRARY_PATH", \ yann@1: + "LD_AOUT_PRELOAD", \ yann@1: + "LD_LIBRARY_VERSION" yann@1: yann@1: #endif /* dl-librecon.h */