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:
committed by
Ulrich Drepper
parent
db753e2cfb
commit
30950a5fd2
22
ChangeLog
22
ChangeLog
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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. */
|
||||||
|
@@ -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.
|
||||||
|
@@ -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,
|
||||||
|
@@ -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. */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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. */
|
||||||
|
Reference in New Issue
Block a user