From: Tom Hughes Date: Wed, 8 Aug 2012 08:03:44 +0000 (+0000) Subject: Add support for the tee and vmsplice system calls. BZ#304561. X-Git-Tag: svn/VALGRIND_3_8_0~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1592db60c5008a00b089fba409b2bece8c3b615e;p=thirdparty%2Fvalgrind.git Add support for the tee and vmsplice system calls. BZ#304561. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12861 --- diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index dd3394f8a6..d674c00022 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -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); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index ea2fe125b5..035f7b8343 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index d1b5def4d9..2f1155f3e5 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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 ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index a5ad6b4b51..5009c68b67 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -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