|
From: <sv...@va...> - 2009-05-07 04:18:33
|
Author: njn
Date: 2009-05-07 05:18:27 +0100 (Thu, 07 May 2009)
New Revision: 9790
Log:
Fixed #191761 (getrlimit/setrlimit problem on Darwin) with a patch from Dan
Kegel. Also added a test case for it.
Added:
branches/DARWIN/none/tests/darwin/rlimit.c
branches/DARWIN/none/tests/darwin/rlimit.stderr.exp
branches/DARWIN/none/tests/darwin/rlimit.vgtest
Modified:
branches/DARWIN/coregrind/m_syswrap/syswrap-generic.c
branches/DARWIN/include/vki/vki-darwin.h
branches/DARWIN/none/tests/darwin/Makefile.am
Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-generic.c
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/syswrap-generic.c 2009-05-07 00:59:26 UTC (rev 9789)
+++ branches/DARWIN/coregrind/m_syswrap/syswrap-generic.c 2009-05-07 04:18:27 UTC (rev 9790)
@@ -3107,6 +3107,12 @@
{
POST_MEM_WRITE( a2, sizeof(struct vki_rlimit) );
+#ifdef _RLIMIT_POSIX_FLAG
+ // Darwin will sometimes set _RLIMIT_POSIX_FLAG on getrlimit calls.
+ // Unset it here to make the switch case below work correctly.
+ a1 &= ~_RLIMIT_POSIX_FLAG;
+#endif
+
switch (a1) {
case VKI_RLIMIT_NOFILE:
((struct vki_rlimit *)a2)->rlim_cur = VG_(fd_soft_limit);
@@ -3826,12 +3832,19 @@
PRE(sys_setrlimit)
{
+ UWord arg1 = ARG1;
PRINT("sys_setrlimit ( %ld, %#lx )", ARG1,ARG2);
PRE_REG_READ2(long, "setrlimit",
unsigned int, resource, struct rlimit *, rlim);
PRE_MEM_READ( "setrlimit(rlim)", ARG2, sizeof(struct vki_rlimit) );
- if (ARG1 == VKI_RLIMIT_NOFILE) {
+#ifdef _RLIMIT_POSIX_FLAG
+ // Darwin will sometimes set _RLIMIT_POSIX_FLAG on setrlimit calls.
+ // Unset it here to make the if statements below work correctly.
+ arg1 &= ~_RLIMIT_POSIX_FLAG;
+#endif
+
+ if (arg1 == VKI_RLIMIT_NOFILE) {
if (((struct vki_rlimit *)ARG2)->rlim_cur > VG_(fd_hard_limit) ||
((struct vki_rlimit *)ARG2)->rlim_max != VG_(fd_hard_limit)) {
SET_STATUS_Failure( VKI_EPERM );
@@ -3841,7 +3854,7 @@
SET_STATUS_Success( 0 );
}
}
- else if (ARG1 == VKI_RLIMIT_DATA) {
+ else if (arg1 == VKI_RLIMIT_DATA) {
if (((struct vki_rlimit *)ARG2)->rlim_cur > VG_(client_rlimit_data).rlim_max ||
((struct vki_rlimit *)ARG2)->rlim_max > VG_(client_rlimit_data).rlim_max) {
SET_STATUS_Failure( VKI_EPERM );
@@ -3851,7 +3864,7 @@
SET_STATUS_Success( 0 );
}
}
- else if (ARG1 == VKI_RLIMIT_STACK && tid == 1) {
+ else if (arg1 == VKI_RLIMIT_STACK && tid == 1) {
if (((struct vki_rlimit *)ARG2)->rlim_cur > VG_(client_rlimit_stack).rlim_max ||
((struct vki_rlimit *)ARG2)->rlim_max > VG_(client_rlimit_stack).rlim_max) {
SET_STATUS_Failure( VKI_EPERM );
Modified: branches/DARWIN/include/vki/vki-darwin.h
===================================================================
--- branches/DARWIN/include/vki/vki-darwin.h 2009-05-07 00:59:26 UTC (rev 9789)
+++ branches/DARWIN/include/vki/vki-darwin.h 2009-05-07 04:18:27 UTC (rev 9790)
@@ -636,7 +636,7 @@
#define VKI_RLIMIT_MEMLOCK RLIMIT_MEMLOCK
#define VKI_RLIMIT_NPROC RLIMIT_NPROC
#define VKI_RLIMIT_NOFILE RLIMIT_NOFILE
-#define VKI_RLIM_NLIMITS RLIM_MLIMITS
+#define VKI_RLIM_NLIMITS RLIM_NLIMITS
#define vki_rlim_t rlim_t
#define vki_rlimit rlimit
Modified: branches/DARWIN/none/tests/darwin/Makefile.am
===================================================================
--- branches/DARWIN/none/tests/darwin/Makefile.am 2009-05-07 00:59:26 UTC (rev 9789)
+++ branches/DARWIN/none/tests/darwin/Makefile.am 2009-05-07 04:18:27 UTC (rev 9790)
@@ -4,10 +4,12 @@
noinst_SCRIPTS = filter_stderr
EXTRA_DIST = $(noinst_SCRIPTS) \
- apple-main-arg.stderr.exp apple-main-arg.vgtest
+ apple-main-arg.stderr.exp apple-main-arg.vgtest \
+ rlimit.stderr.exp rlimit.vgtest
check_PROGRAMS = \
- apple-main-arg
+ apple-main-arg \
+ rlimit
AM_CFLAGS += $(AM_FLAG_M3264_PRI)
Added: branches/DARWIN/none/tests/darwin/rlimit.c
===================================================================
--- branches/DARWIN/none/tests/darwin/rlimit.c (rev 0)
+++ branches/DARWIN/none/tests/darwin/rlimit.c 2009-05-07 04:18:27 UTC (rev 9790)
@@ -0,0 +1,17 @@
+// Small test program to demonstrate Valgrind bug.
+// https://bugs.kde.org/show_bug.cgi?id=191761
+// Author: roh...@go...
+//
+// Before the fix, it was printing 266. Now it prints 256.
+
+#include <stdio.h>
+#include <sys/resource.h>
+
+int main(void)
+{
+ struct rlimit rlp;
+ getrlimit(RLIMIT_NOFILE, &rlp);
+ fprintf(stderr, "RLIMIT_NOFILE is %lld\n", (long long)rlp.rlim_cur);
+ return 0;
+}
+
Added: branches/DARWIN/none/tests/darwin/rlimit.stderr.exp
===================================================================
--- branches/DARWIN/none/tests/darwin/rlimit.stderr.exp (rev 0)
+++ branches/DARWIN/none/tests/darwin/rlimit.stderr.exp 2009-05-07 04:18:27 UTC (rev 9790)
@@ -0,0 +1 @@
+RLIMIT_NOFILE is 256
Added: branches/DARWIN/none/tests/darwin/rlimit.vgtest
===================================================================
--- branches/DARWIN/none/tests/darwin/rlimit.vgtest (rev 0)
+++ branches/DARWIN/none/tests/darwin/rlimit.vgtest 2009-05-07 04:18:27 UTC (rev 9790)
@@ -0,0 +1,2 @@
+prog: rlimit
+vgopts: -q
|