1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-07 06:43:00 +03:00

Make PowerPC64 default to nonexecutable stack

This commit is contained in:
Ryan S. Arnold
2010-12-19 22:49:01 -05:00
committed by Ulrich Drepper
parent db753e2cfb
commit 30950a5fd2
13 changed files with 104 additions and 18 deletions

View File

@@ -1,3 +1,25 @@
2010-12-15 Ryan S. Arnold <rsa@us.ibm.com>
* elf/Makefile: (check-execstack): Replace $(native-compile) with a
similar rule which adds the sysdep directories to the header search in
order to pick up the correct platform stackinfo.h.
* elf/check-execstack.c (main): Check DEFAULT_STACK_PERMS for PF_X and
perform test if it is, otherwise return successfully without testing.
* elf/dl-load.c (_dl_map_object_from_fd): Source stack_flags from
DEFAULT_STACK_PERMS define in stackinfo.h.
* elf/dl-support.c (_dl_stack_flags): Source from DEFAULT_STACK_PERMS
defined in stackinfo.h.
* elf/rtld.c (_dl_starting_up): Source ._dl_stack_flags from
DEFAULT_STACK_PERMS defined in stackinfo.h.
* sysdeps/i386/stackinfo.h: Define DEFAULT_STACK_PERMS with PF_X.
* sysdeps/ia64/stackinfo.h: Likewise.
* sysdeps/s390/stackinfo.h: Likewise.
* sysdeps/sh/stackinfo.h: Likewise.
* sysdeps/sparc/stackinfo.h: Likewise.
* sysdeps/x86_64/stackinfo.h: Likewise.
* sysdeps/powerpc/stackinfo.h: Define DEFAULT_STACK_PERMS without
PF_X for powerpc64. Retain PF_X for powerpc32.
2010-12-19 Ulrich Drepper <drepper@gmail.com> 2010-12-19 Ulrich Drepper <drepper@gmail.com>
* sysdeps/unix/readdir_r.c (__READDIR_R): Compute reclen more accurate. * sysdeps/unix/readdir_r.c (__READDIR_R): Compute reclen more accurate.

View File

@@ -899,8 +899,14 @@ $(objpfx)check-textrel: check-textrel.c
$(native-compile) $(native-compile)
check-execstack-CFLAGS = -O -Wall -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -std=gnu99 check-execstack-CFLAGS = -O -Wall -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -std=gnu99
# Perform the same operation as $(native-compile) but add the sysdeps
# directories as header search locations.
$(objpfx)check-execstack: check-execstack.c $(objpfx)check-execstack: check-execstack.c
$(native-compile) $(make-target-directory)
$(patsubst %/,cd % &&,$(objpfx)) \
$(BUILD_CC) $($(basename $(<F))-CFLAGS) $(ALL_BUILD_CFLAGS) \
$(addprefix -I$(shell pwd)/,$(sysdirs)) -I$(shell pwd) \
$(firstword $(filter /%,$< $(shell pwd)/$<)) -o $(@F)
check-localplt-CFLAGS = -O -Wall -D_GNU_SOURCE -std=gnu99 check-localplt-CFLAGS = -O -Wall -D_GNU_SOURCE -std=gnu99
$(objpfx)check-localplt: check-localplt.c $(objpfx)check-localplt: check-localplt.c

View File

@@ -1,5 +1,5 @@
/* Check for executable stacks in DSOs. /* Check for executable stacks in DSOs.
Copyright (C) 2009 Free Software Foundation, Inc. Copyright (C) 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contribute by Ulrich Drepper <drepper@redhat.com>. 2009. Contribute by Ulrich Drepper <drepper@redhat.com>. 2009.
@@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <stackinfo.h>
#ifdef BITS #ifdef BITS
@@ -150,9 +151,13 @@ main (int argc, char *argv[])
int cnt; int cnt;
int result = 0; int result = 0;
for (cnt = 1; cnt < argc; ++cnt) /* We can return successfully, i.e., not fail, if PF_X isn't present. If it
result |= handle_file (argv[cnt]); * is present then check for the GNU_STACK header. */
if (DEFAULT_STACK_PERMS & PF_X)
{
for (cnt = 1; cnt < argc; ++cnt)
result |= handle_file (argv[cnt]);
}
return result; return result;
} }
#endif #endif

View File

@@ -984,8 +984,10 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp,
} }
} }
/* Presumed absent PT_GNU_STACK. */ /* On most platforms presume that PT_GNU_STACK is absent and the stack is
uint_fast16_t stack_flags = PF_R|PF_W|PF_X; * executable. Other platforms default to a nonexecutable stack and don't
* need PT_GNU_STACK to do so. */
uint_fast16_t stack_flags = DEFAULT_STACK_PERMS;
{ {
/* Scan the program header table, collecting its load commands. */ /* Scan the program header table, collecting its load commands. */

View File

@@ -32,6 +32,7 @@
#include <dl-procinfo.h> #include <dl-procinfo.h>
#include <unsecvars.h> #include <unsecvars.h>
#include <hp-timing.h> #include <hp-timing.h>
#include <stackinfo.h>
extern char *__progname; extern char *__progname;
char **_dl_argv = &__progname; /* This is checked for some error messages. */ char **_dl_argv = &__progname; /* This is checked for some error messages. */
@@ -134,8 +135,9 @@ uint64_t _dl_hwcap __attribute__ ((nocommon));
setting _dl_hwcap nonzero below, but we do anyway. */ setting _dl_hwcap nonzero below, but we do anyway. */
uint64_t _dl_hwcap_mask __attribute__ ((nocommon)); uint64_t _dl_hwcap_mask __attribute__ ((nocommon));
/* Prevailing state of the stack, PF_X indicating it's executable. */ /* Prevailing state of the stack. Generally this includes PF_X, indicating it's
ElfW(Word) _dl_stack_flags = PF_R|PF_W|PF_X; * executable but this isn't true for all platforms. */
ElfW(Word) _dl_stack_flags = DEFAULT_STACK_PERMS;
/* If loading a shared object requires that we make the stack executable /* If loading a shared object requires that we make the stack executable
when it was not, we do it by calling this function. when it was not, we do it by calling this function.

View File

@@ -40,6 +40,7 @@
#include <dl-osinfo.h> #include <dl-osinfo.h>
#include <dl-procinfo.h> #include <dl-procinfo.h>
#include <tls.h> #include <tls.h>
#include <stackinfo.h>
#include <assert.h> #include <assert.h>
@@ -122,8 +123,9 @@ INTVARDEF(_dl_starting_up)
(except those which cannot be added for some reason). */ (except those which cannot be added for some reason). */
struct rtld_global _rtld_global = struct rtld_global _rtld_global =
{ {
/* Default presumption without further information is executable stack. */ /* Generally the default presumption without further information is an
._dl_stack_flags = PF_R|PF_W|PF_X, * executable stack but this is not true for all platforms. */
._dl_stack_flags = DEFAULT_STACK_PERMS,
#ifdef _LIBC_REENTRANT #ifdef _LIBC_REENTRANT
._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER, ._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,
._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER, ._dl_load_write_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER,

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1999, 2009 Free Software Foundation, Inc. /* Copyright (C) 1999, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,9 +22,15 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On x86 the stack grows down. */ /* On x86 the stack grows down. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
* present, but it is presumed absent. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
/* Access to the stack pointer. The macros are used in alloca_account /* Access to the stack pointer. The macros are used in alloca_account
for which they need to act as barriers as well, hence the additional for which they need to act as barriers as well, hence the additional
(unnecessary) parameters. */ (unnecessary) parameters. */

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,8 +22,14 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On IA-64 the stack grows down. The register stack is of no concern /* On IA-64 the stack grows down. The register stack is of no concern
here. */ here. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
* present, but it is presumed absent. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
#endif /* stackinfo.h */ #endif /* stackinfo.h */

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1999 Free Software Foundation, Inc. /* Copyright (C) 1999, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,7 +22,18 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On PPC the stack grows down. */ /* On PPC the stack grows down. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
#if __WORDSIZE == 64
/* PPC64 doesn't need an executable stack and doesn't need PT_GNU_STACK
* to make the stack nonexecutable. */
# define DEFAULT_STACK_PERMS (PF_R|PF_W)
#else
/* PF_X can be overridden if PT_GNU_STACK is present but is presumed absent. */
# define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
#endif
#endif /* stackinfo.h */ #endif /* stackinfo.h */

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2000 Free Software Foundation, Inc. /* Copyright (C) 2000, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,7 +22,13 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On s390 the stack grows down. */ /* On s390 the stack grows down. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
* present, but it is presumed absent. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
#endif /* stackinfo.h */ #endif /* stackinfo.h */

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,7 +22,13 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On SH the stack grows down. */ /* On SH the stack grows down. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
* present, but it is presumed absent. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
#endif /* stackinfo.h */ #endif /* stackinfo.h */

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. /* Copyright (C) 2001, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,7 +22,13 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On sparc the stack grows down. */ /* On sparc the stack grows down. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
* present, but it is presumed absent. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
#endif /* stackinfo.h */ #endif /* stackinfo.h */

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 2001, 2009 Free Software Foundation, Inc. /* Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -22,9 +22,15 @@
#ifndef _STACKINFO_H #ifndef _STACKINFO_H
#define _STACKINFO_H 1 #define _STACKINFO_H 1
#include <elf.h>
/* On x86_64 the stack grows down. */ /* On x86_64 the stack grows down. */
#define _STACK_GROWS_DOWN 1 #define _STACK_GROWS_DOWN 1
/* Default to an executable stack. PF_X can be overridden if PT_GNU_STACK is
* present, but it is presumed absent. */
#define DEFAULT_STACK_PERMS (PF_R|PF_W|PF_X)
/* Access to the stack pointer. The macros are used in alloca_account /* Access to the stack pointer. The macros are used in alloca_account
for which they need to act as barriers as well, hence the additional for which they need to act as barriers as well, hence the additional
(unnecessary) parameters. */ (unnecessary) parameters. */