|
From: <sv...@va...> - 2014-09-19 19:35:33
|
Author: philippe
Date: Fri Sep 19 19:35:24 2014
New Revision: 14559
Log:
Fix wrong checking of ARG2 of getrlimit
(spotted by Florian Krohm/IBM's BEAM checker)
Modified:
trunk/coregrind/m_syswrap/syswrap-generic.c
trunk/none/tests/rlimit_nofile.c
Modified: trunk/coregrind/m_syswrap/syswrap-generic.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-generic.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-generic.c Fri Sep 19 19:35:24 2014
@@ -4115,8 +4115,12 @@
arg1 &= ~_RLIMIT_POSIX_FLAG;
#endif
- if (ARG2 &&
- ((struct vki_rlimit *)ARG2)->rlim_cur > ((struct vki_rlimit *)ARG2)->rlim_max) {
+ if (!VG_(am_is_valid_for_client)(ARG2, sizeof(struct vki_rlimit),
+ VKI_PROT_READ)) {
+ SET_STATUS_Failure( VKI_EFAULT );
+ }
+ else if (((struct vki_rlimit *)ARG2)->rlim_cur
+ > ((struct vki_rlimit *)ARG2)->rlim_max) {
SET_STATUS_Failure( VKI_EINVAL );
}
else if (arg1 == VKI_RLIMIT_NOFILE) {
Modified: trunk/none/tests/rlimit_nofile.c
==============================================================================
--- trunk/none/tests/rlimit_nofile.c (original)
+++ trunk/none/tests/rlimit_nofile.c Fri Sep 19 19:35:24 2014
@@ -97,6 +97,12 @@
{
perror("open");
}
+
+ if (setrlimit(RLIMIT_NOFILE, NULL) != -1 || errno != EFAULT)
+ {
+ fprintf(stderr, "setrlimit non addressable arg2 must set errno=EFAULT\n");
+ exit(1);
+ }
exit(0);
}
|