]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for the tee and vmsplice system calls. BZ#304561.
authorTom Hughes <tom@compton.nu>
Wed, 8 Aug 2012 08:03:44 +0000 (08:03 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 8 Aug 2012 08:03:44 +0000 (08:03 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12861

coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c

index dd3394f8a6151867c396b0e89d8e3d775865e03d..d674c000221ad0d9ff79543a82547345a0799805 100644 (file)
@@ -55,6 +55,8 @@ DECL_TEMPLATE(linux, sys_recvmmsg);
 DECL_TEMPLATE(linux, sys_dup3);
 DECL_TEMPLATE(linux, sys_getcpu);
 DECL_TEMPLATE(linux, sys_splice);
+DECL_TEMPLATE(linux, sys_tee);
+DECL_TEMPLATE(linux, sys_vmsplice);
 DECL_TEMPLATE(linux, sys_readahead);
 DECL_TEMPLATE(linux, sys_move_pages);
 
index ea2fe125b5e009342905b80d5d8f8c462e076704..035f7b83432b2294b9e7f7c3ebfd8977597a983c 100644 (file)
@@ -1400,9 +1400,9 @@ static SyscallTableEntry syscall_table[] = {
    LINXY(__NR_get_robust_list,  sys_get_robust_list),  // 274
 
    LINX_(__NR_splice,            sys_splice),           // 275
-//   LINX_(__NR_tee,               sys_ni_syscall),       // 276
+   LINX_(__NR_tee,               sys_tee),              // 276
    LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 277
-//   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 278
+   LINXY(__NR_vmsplice,          sys_vmsplice),         // 278
    LINXY(__NR_move_pages,        sys_move_pages),       // 279
 
    LINX_(__NR_utimensat,         sys_utimensat),        // 280
index d1b5def4d9e46077e64ab059d67a0191cb1f05b8..2f1155f3e555d4d65e357211b1a501ad2197a3fd 100644 (file)
@@ -3940,7 +3940,7 @@ PRE(sys_splice)
    *flags |= SfMayBlock;
    PRINT("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )",
          ARG1,ARG2,ARG3,ARG4,ARG5,ARG6);
-   PRE_REG_READ6(int32_t, "splice",
+   PRE_REG_READ6(vki_ssize_t, "splice",
                  int, fd_in, vki_loff_t *, off_in,
                  int, fd_out, vki_loff_t *, off_out,
                  vki_size_t, len, unsigned int, flags);
@@ -3955,6 +3955,64 @@ PRE(sys_splice)
    }
 }
 
+PRE(sys_tee)
+{
+   *flags |= SfMayBlock;
+   PRINT("sys_tree ( %ld, %ld, %ld, %ld )", ARG1,ARG2,ARG3,ARG4);
+   PRE_REG_READ4(vki_ssize_t, "tee",
+                 int, fd_in, int, fd_out,
+                 vki_size_t, len, unsigned int, flags);
+   if (!ML_(fd_allowed)(ARG1, "tee(fd_in)", tid, False) ||
+       !ML_(fd_allowed)(ARG2, "tee(fd_out)", tid, False)) {
+      SET_STATUS_Failure( VKI_EBADF );
+   }
+}
+
+PRE(sys_vmsplice)
+{
+   Int fdfl;
+   *flags |= SfMayBlock;
+   PRINT("sys_vmsplice ( %ld, %#lx, %ld, %ld )",
+         ARG1,ARG2,ARG3,ARG4);
+   PRE_REG_READ4(vki_ssize_t, "splice",
+                 int, fd, struct vki_iovec *, iov,
+                 unsigned long, nr_segs, unsigned int, flags);
+   if (!ML_(fd_allowed)(ARG1, "vmsplice(fd)", tid, False)) {
+      SET_STATUS_Failure( VKI_EBADF );
+   } else if ((fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0)) < 0) {
+      SET_STATUS_Failure( VKI_EBADF );
+   } else {
+      const struct vki_iovec *iov;
+      PRE_MEM_READ( "vmsplice(iov)", ARG2, sizeof(struct vki_iovec) * ARG3 );
+      for (iov = (struct vki_iovec *)ARG2;
+           iov < (struct vki_iovec *)ARG2 + ARG3; iov++) 
+      {
+         if ((fdfl & (VKI_O_WRONLY|VKI_O_RDWR)) != 0)
+            PRE_MEM_READ( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
+         else if ((fdfl & VKI_O_RDONLY) != 0)
+            PRE_MEM_WRITE( "vmsplice(iov[...])", (Addr)iov->iov_base, iov->iov_len );
+      }
+   }
+}
+
+POST(sys_vmsplice)
+{
+   vg_assert(SUCCESS);
+   if (RES > 0) {
+      Int fdfl = VG_(fcntl)(ARG1, VKI_F_GETFL, 0);
+      vg_assert(fdfl >= 0);
+      if ((fdfl & VKI_O_RDONLY) != 0)
+      {
+         const struct vki_iovec *iov;
+         for (iov = (struct vki_iovec *)ARG2;
+              iov < (struct vki_iovec *)ARG2 + ARG3; iov++) 
+         {
+            POST_MEM_WRITE( (Addr)iov->iov_base, iov->iov_len );
+         }
+      }
+   }
+}
+
 /* ---------------------------------------------------------------------
    oprofile-related wrappers
    ------------------------------------------------------------------ */
index a5ad6b4b513c557be83c4bc368e7c1182f80917d..5009c68b67655468be4544a2d11b604fb25fc12c 100644 (file)
@@ -2195,8 +2195,8 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_splice,            sys_splice),           // 313
    LINX_(__NR_sync_file_range,   sys_sync_file_range),  // 314
 
-//   LINX_(__NR_tee,               sys_ni_syscall),       // 315
-//   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 316
+   LINX_(__NR_tee,               sys_tee),              // 315
+   LINXY(__NR_vmsplice,          sys_vmsplice),         // 316
    LINXY(__NR_move_pages,        sys_move_pages),       // 317
    LINXY(__NR_getcpu,            sys_getcpu),           // 318
    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 319