]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix wrong checking of ARG2 of getrlimit
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Fri, 19 Sep 2014 19:35:24 +0000 (19:35 +0000)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Fri, 19 Sep 2014 19:35:24 +0000 (19:35 +0000)
(spotted by Florian Krohm/IBM's BEAM checker)

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14559

coregrind/m_syswrap/syswrap-generic.c
none/tests/rlimit_nofile.c

index 79d9320f857e88a55d216cd45698f54776995c41..0fa172cda3eff80a1be39fa20b03071400878411 100644 (file)
@@ -4115,8 +4115,12 @@ PRE(sys_setrlimit)
    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) {
index 135f1a14e9a587208bff42dd139b21d2facafaf2..c6d2be6b9914fa82f7e6413ea0b5b488b6468390 100644 (file)
@@ -97,6 +97,12 @@ int main(int argc, char **argv)
    {
       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);
 }