]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix Valgrind internal error when dereferencing memory supplied by a client
authorIvo Raisr <ivosh@ivosh.net>
Fri, 5 May 2017 13:20:15 +0000 (13:20 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Fri, 5 May 2017 13:20:15 +0000 (13:20 +0000)
in ptrace(getregset) and ptrace(setregset) syscall wrappers.
n-i-bz

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

coregrind/m_syswrap/syswrap-linux.c

index 9ed7adc97492b1f426d2afacde827711c218bb14..ad78d1eea184be22e7ed5ac4ef1d542c8a6512a1 100644 (file)
@@ -11190,12 +11190,12 @@ ML_(linux_PRE_getregset) ( ThreadId tid, long arg3, long arg4 )
 {
    struct vki_iovec *iov = (struct vki_iovec *) arg4;
 
-   PRE_MEM_READ("ptrace(getregset iovec->iov_base)",
-               (unsigned long) &iov->iov_base, sizeof(iov->iov_base));
-   PRE_MEM_READ("ptrace(getregset iovec->iov_len)",
-               (unsigned long) &iov->iov_len, sizeof(iov->iov_len));
-   PRE_MEM_WRITE("ptrace(getregset *(iovec->iov_base))",
-                (unsigned long) iov->iov_base, iov->iov_len);
+   PRE_FIELD_READ("ptrace(getregset iovec->iov_base)", iov->iov_base);
+   PRE_FIELD_READ("ptrace(getregset iovec->iov_len)", iov->iov_len);
+   if (ML_(safe_to_deref)(iov, sizeof(struct vki_iovec))) {
+      PRE_MEM_WRITE("ptrace(getregset *(iovec->iov_base))",
+                    (Addr) iov->iov_base, iov->iov_len);
+   }
 }
 
 void
@@ -11203,12 +11203,12 @@ ML_(linux_PRE_setregset) ( ThreadId tid, long arg3, long arg4 )
 {
    struct vki_iovec *iov = (struct vki_iovec *) arg4;
 
-   PRE_MEM_READ("ptrace(setregset iovec->iov_base)",
-               (unsigned long) &iov->iov_base, sizeof(iov->iov_base));
-   PRE_MEM_READ("ptrace(setregset iovec->iov_len)",
-               (unsigned long) &iov->iov_len, sizeof(iov->iov_len));
-   PRE_MEM_READ("ptrace(setregset *(iovec->iov_base))",
-               (unsigned long) iov->iov_base, iov->iov_len);
+   PRE_FIELD_READ("ptrace(setregset iovec->iov_base)", iov->iov_base);
+   PRE_FIELD_READ("ptrace(setregset iovec->iov_len)", iov->iov_len);
+   if (ML_(safe_to_deref)(iov, sizeof(struct vki_iovec))) {
+      PRE_MEM_READ("ptrace(setregset *(iovec->iov_base))",
+                   (Addr) iov->iov_base, iov->iov_len);
+   }
 }
 
 void