|
From: <sv...@va...> - 2005-11-08 16:52:07
|
Author: tom
Date: 2005-11-08 16:51:55 +0000 (Tue, 08 Nov 2005)
New Revision: 5041
Log:
Handle the PROT_GROWSDOWN and PROT_GROWSUP mprotect flags properly
which stops glibc falling over when a program requires an executable
stack and glibc has been built to assume that PROT_GROWSDOWN will work.
Modified:
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/include/vki-amd64-linux.h
trunk/include/vki-ppc32-linux.h
trunk/include/vki-x86-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syswrap/syswrap-generic.c 2005-11-08 15:52:36 UTC (=
rev 5040)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c 2005-11-08 16:51:55 UTC (=
rev 5041)
@@ -4552,8 +4552,43 @@
PRE_REG_READ3(long, "mprotect",
unsigned long, addr, vki_size_t, len, unsigned long, pr=
ot);
=20
- if (!ML_(valid_client_addr)(ARG1, ARG2, tid, "mprotect"))
+ if (!ML_(valid_client_addr)(ARG1, ARG2, tid, "mprotect")) {
SET_STATUS_Failure( VKI_ENOMEM );
+ } else if (ARG3 & (VKI_PROT_GROWSDOWN|VKI_PROT_GROWSUP)) {
+ UInt grows =3D ARG3 & (VKI_PROT_GROWSDOWN|VKI_PROT_GROWSUP);
+ NSegment *aseg =3D VG_(am_find_nsegment)(ARG1);
+ NSegment *rseg;
+
+ vg_assert(aseg);
+
+ if (grows =3D=3D VKI_PROT_GROWSDOWN) {
+ rseg =3D VG_(am_next_nsegment)( aseg, False/*backwards*/ );
+ if (rseg &&
+ rseg->kind =3D=3D SkResvn &&
+ rseg->smode =3D=3D SmUpper &&
+ rseg->end+1 =3D=3D aseg->start) {
+ Addr end =3D ARG1 + ARG2;
+ ARG1 =3D aseg->start;
+ ARG2 =3D end - aseg->start;
+ ARG3 &=3D ~VKI_PROT_GROWSDOWN;
+ } else {
+ SET_STATUS_Failure( VKI_EINVAL );
+ }
+ } else if (grows =3D=3D VKI_PROT_GROWSUP) {
+ rseg =3D VG_(am_next_nsegment)( aseg, True/*forwards*/ );
+ if (rseg &&
+ rseg->kind =3D=3D SkResvn &&
+ rseg->smode =3D=3D SmLower &&
+ aseg->end+1 =3D=3D rseg->start) {
+ ARG2 =3D aseg->end - ARG1 + 1;
+ ARG3 &=3D ~VKI_PROT_GROWSUP;
+ } else {
+ SET_STATUS_Failure( VKI_EINVAL );
+ }
+ } else {
+ SET_STATUS_Failure( VKI_EINVAL );
+ }
+ }
}
=20
POST(sys_mprotect)
Modified: trunk/include/vki-amd64-linux.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/vki-amd64-linux.h 2005-11-08 15:52:36 UTC (rev 5040)
+++ trunk/include/vki-amd64-linux.h 2005-11-08 16:51:55 UTC (rev 5041)
@@ -216,6 +216,8 @@
#define VKI_PROT_WRITE 0x2 /* page can be written */
#define VKI_PROT_EXEC 0x4 /* page can be executed */
#define VKI_PROT_NONE 0x0 /* page can not be accessed */
+#define VKI_PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to=
start of growsdown vma */
+#define VKI_PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to e=
nd of growsup vma */
=20
#define VKI_MAP_SHARED 0x01 /* Share changes */
#define VKI_MAP_PRIVATE 0x02 /* Changes are private */
Modified: trunk/include/vki-ppc32-linux.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/vki-ppc32-linux.h 2005-11-08 15:52:36 UTC (rev 5040)
+++ trunk/include/vki-ppc32-linux.h 2005-11-08 16:51:55 UTC (rev 5041)
@@ -237,6 +237,8 @@
#define VKI_PROT_READ 0x1 /* page can be read */
#define VKI_PROT_WRITE 0x2 /* page can be written */
#define VKI_PROT_EXEC 0x4 /* page can be executed */
+#define VKI_PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to=
start of growsdown vma */
+#define VKI_PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to e=
nd of growsup vma */
=20
#define VKI_MAP_SHARED 0x01 /* Share changes */
#define VKI_MAP_PRIVATE 0x02 /* Changes are private */
Modified: trunk/include/vki-x86-linux.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/vki-x86-linux.h 2005-11-08 15:52:36 UTC (rev 5040)
+++ trunk/include/vki-x86-linux.h 2005-11-08 16:51:55 UTC (rev 5041)
@@ -246,6 +246,8 @@
#define VKI_PROT_READ 0x1 /* page can be read */
#define VKI_PROT_WRITE 0x2 /* page can be written */
#define VKI_PROT_EXEC 0x4 /* page can be executed */
+#define VKI_PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to=
start of growsdown vma */
+#define VKI_PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to e=
nd of growsup vma */
=20
#define VKI_MAP_SHARED 0x01 /* Share changes */
#define VKI_MAP_PRIVATE 0x02 /* Changes are private */
|