mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	from definition. * sysdeps/x86_64/dl-machine.h (elf_machine_rela): Don't define label if it is not used. * elf/dl-profile.c (_dl_start_profile): Define real-type variant of gmon_hist_hdr and gmon_hdr structures and use them. * elf/dl-load.c (open_verify): Add temporary variable to avoid warning. * nscd/nscd_helper.c (get_mapping): Avoid casts to avoid warnings. * sunrpc/clnt_raw.c (clntraw_private_s): Use union in definition to avoid cast. * inet/rexec.c (rexec_af): Make sa2 a union to avoid warnings. * inet/rcmd.c (rcmd_af): Make from a union of the various needed types to avoid warnings. (iruserok_af): Use ss_family instead of casts. * gmon/gmon.c (write_hist): Define real-type variant of gmon_hist_hdr structure and use it. (write_gmon): Likewise for gmon_hdr. * sysdeps/unix/sysv/linux/readv.c: Avoid declaration of replacement function if we are not going to define it. * sysdeps/unix/sysv/linux/writev.c: Likewise. * inet/inet6_option.c (optin_alloc): Add temporary variable to avoid warning. * libio/strfile.h (struct _IO_streambuf): Use correct type and name of VTable element. * libio/iovsprintf.c: Avoid casts to avoid warnings. * libio/iovsscanf.c: Likewise. * libio/vasprintf.c: Likewise. * libio/vsnprintf.c: Likewise. * stdio-common/isoc99_vsscanf.c: Likewise. * stdlib/strfmon_l.c: Likewise. * debug/vasprintf_chk.c: Likewise. * debug/vsnprintf_chk.c: Likewise. * debug/vsprintf_chk.c: Likewise.
		
			
				
	
	
		
			112 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Operating system specific code for generic dynamic loader functions.  Linux.
 | |
|    Copyright (C) 2000-2002,2004-2008, 2009 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 Lesser General Public
 | |
|    License as published by the Free Software Foundation; either
 | |
|    version 2.1 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
 | |
|    Lesser General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU Lesser General Public
 | |
|    License along with the GNU C Library; if not, write to the Free
 | |
|    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 | |
|    02111-1307 USA.  */
 | |
| 
 | |
| #include <kernel-features.h>
 | |
| #include <dl-sysdep.h>
 | |
| #include <fcntl.h>
 | |
| #include <stdint.h>
 | |
| 
 | |
| #ifndef MIN
 | |
| # define MIN(a,b) (((a)<(b))?(a):(b))
 | |
| #endif
 | |
| 
 | |
| #ifdef SHARED
 | |
| /* This is the function used in the dynamic linker to print the fatal error
 | |
|    message.  */
 | |
| static void
 | |
| __attribute__ ((__noreturn__))
 | |
| dl_fatal (const char *str)
 | |
| {
 | |
|   _dl_dprintf (2, str);
 | |
|   _exit (1);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #define DL_SYSDEP_OSCHECK(FATAL)					      \
 | |
|   do {									      \
 | |
|     /* Test whether the kernel is new enough.  This test is only performed    \
 | |
|        if the library is not compiled to run on all kernels.  */	      \
 | |
| 									      \
 | |
|     int version = _dl_discover_osversion ();				      \
 | |
|     if (__builtin_expect (version >= 0, 1))				      \
 | |
|       {									      \
 | |
| 	if (__builtin_expect (GLRO(dl_osversion) == 0, 1)		      \
 | |
| 	    || GLRO(dl_osversion) > version)				      \
 | |
| 	  GLRO(dl_osversion) = version;					      \
 | |
| 									      \
 | |
| 	/* Now we can test with the required version.  */		      \
 | |
| 	if (__LINUX_KERNEL_VERSION > 0 && version < __LINUX_KERNEL_VERSION)   \
 | |
| 	  /* Not sufficent.  */						      \
 | |
| 	  FATAL ("FATAL: kernel too old\n");				      \
 | |
|       }									      \
 | |
|     else if (__LINUX_KERNEL_VERSION > 0)				      \
 | |
|       FATAL ("FATAL: cannot determine kernel version\n");		      \
 | |
|   } while (0)
 | |
| 
 | |
| static inline uintptr_t __attribute__ ((always_inline))
 | |
| _dl_setup_stack_chk_guard (void *dl_random)
 | |
| {
 | |
|   uintptr_t ret;
 | |
| #ifndef __ASSUME_AT_RANDOM
 | |
|   if (__builtin_expect (dl_random == NULL, 0))
 | |
|     {
 | |
| # ifdef ENABLE_STACKGUARD_RANDOMIZE
 | |
|       int fd = __open ("/dev/urandom", O_RDONLY);
 | |
|       if (fd >= 0)
 | |
| 	{
 | |
| 	  ssize_t reslen = __read (fd, &ret, sizeof (ret));
 | |
| 	  __close (fd);
 | |
| 	  if (reslen == (ssize_t) sizeof (ret))
 | |
| 	    return ret;
 | |
| 	}
 | |
| # endif
 | |
|       ret = 0;
 | |
|       unsigned char *p = (unsigned char *) &ret;
 | |
|       p[sizeof (ret) - 1] = 255;
 | |
|       p[sizeof (ret) - 2] = '\n';
 | |
|     }
 | |
|   else
 | |
| #endif
 | |
|     /* We need in the moment only 8 bytes on 32-bit platforms and 16
 | |
|        bytes on 64-bit platforms.  Therefore we can use the data
 | |
|        directly and not use the kernel-provided data to seed a PRNG.  */
 | |
|     memcpy (&ret, dl_random, sizeof (ret));
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| static inline uintptr_t __attribute__ ((always_inline))
 | |
| _dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
 | |
| {
 | |
|   uintptr_t ret;
 | |
| #ifndef __ASSUME_AT_RANDOM
 | |
|   if (dl_random == NULL)
 | |
|     {
 | |
|       ret = stack_chk_guard;
 | |
| # ifndef HP_TIMING_NONAVAIL
 | |
|       hp_timing_t now;
 | |
|       HP_TIMING_NOW (now);
 | |
|       ret ^= now;
 | |
| # endif
 | |
|     }
 | |
|   else
 | |
| #endif
 | |
|     memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
 | |
|   return ret;
 | |
| }
 |