@@ -3940,7 +3940,7 @@ PRE(sys_splice)
3940
3940
* flags |= SfMayBlock ;
3941
3941
PRINT ("sys_splice ( %ld, %#lx, %ld, %#lx, %ld, %ld )" ,
3942
3942
ARG1 ,ARG2 ,ARG3 ,ARG4 ,ARG5 ,ARG6 );
3943
- PRE_REG_READ6 (int32_t , "splice" ,
3943
+ PRE_REG_READ6 (vki_ssize_t , "splice" ,
3944
3944
int , fd_in , vki_loff_t * , off_in ,
3945
3945
int , fd_out , vki_loff_t * , off_out ,
3946
3946
vki_size_t , len , unsigned int , flags );
@@ -3955,6 +3955,64 @@ PRE(sys_splice)
3955
3955
}
3956
3956
}
3957
3957
3958
+ PRE (sys_tee )
3959
+ {
3960
+ * flags |= SfMayBlock ;
3961
+ PRINT ("sys_tree ( %ld, %ld, %ld, %ld )" , ARG1 ,ARG2 ,ARG3 ,ARG4 );
3962
+ PRE_REG_READ4 (vki_ssize_t , "tee" ,
3963
+ int , fd_in , int , fd_out ,
3964
+ vki_size_t , len , unsigned int , flags );
3965
+ if (!ML_ (fd_allowed )(ARG1 , "tee(fd_in)" , tid , False ) ||
3966
+ !ML_ (fd_allowed )(ARG2 , "tee(fd_out)" , tid , False )) {
3967
+ SET_STATUS_Failure ( VKI_EBADF );
3968
+ }
3969
+ }
3970
+
3971
+ PRE (sys_vmsplice )
3972
+ {
3973
+ Int fdfl ;
3974
+ * flags |= SfMayBlock ;
3975
+ PRINT ("sys_vmsplice ( %ld, %#lx, %ld, %ld )" ,
3976
+ ARG1 ,ARG2 ,ARG3 ,ARG4 );
3977
+ PRE_REG_READ4 (vki_ssize_t , "splice" ,
3978
+ int , fd , struct vki_iovec * , iov ,
3979
+ unsigned long , nr_segs , unsigned int , flags );
3980
+ if (!ML_ (fd_allowed )(ARG1 , "vmsplice(fd)" , tid , False )) {
3981
+ SET_STATUS_Failure ( VKI_EBADF );
3982
+ } else if ((fdfl = VG_ (fcntl )(ARG1 , VKI_F_GETFL , 0 )) < 0 ) {
3983
+ SET_STATUS_Failure ( VKI_EBADF );
3984
+ } else {
3985
+ const struct vki_iovec * iov ;
3986
+ PRE_MEM_READ ( "vmsplice(iov)" , ARG2 , sizeof (struct vki_iovec ) * ARG3 );
3987
+ for (iov = (struct vki_iovec * )ARG2 ;
3988
+ iov < (struct vki_iovec * )ARG2 + ARG3 ; iov ++ )
3989
+ {
3990
+ if ((fdfl & (VKI_O_WRONLY |VKI_O_RDWR )) != 0 )
3991
+ PRE_MEM_READ ( "vmsplice(iov[...])" , (Addr )iov -> iov_base , iov -> iov_len );
3992
+ else if ((fdfl & VKI_O_RDONLY ) != 0 )
3993
+ PRE_MEM_WRITE ( "vmsplice(iov[...])" , (Addr )iov -> iov_base , iov -> iov_len );
3994
+ }
3995
+ }
3996
+ }
3997
+
3998
+ POST (sys_vmsplice )
3999
+ {
4000
+ vg_assert (SUCCESS );
4001
+ if (RES > 0 ) {
4002
+ Int fdfl = VG_ (fcntl )(ARG1 , VKI_F_GETFL , 0 );
4003
+ vg_assert (fdfl >= 0 );
4004
+ if ((fdfl & VKI_O_RDONLY ) != 0 )
4005
+ {
4006
+ const struct vki_iovec * iov ;
4007
+ for (iov = (struct vki_iovec * )ARG2 ;
4008
+ iov < (struct vki_iovec * )ARG2 + ARG3 ; iov ++ )
4009
+ {
4010
+ POST_MEM_WRITE ( (Addr )iov -> iov_base , iov -> iov_len );
4011
+ }
4012
+ }
4013
+ }
4014
+ }
4015
+
3958
4016
/* ---------------------------------------------------------------------
3959
4017
oprofile-related wrappers
3960
4018
------------------------------------------------------------------ */
0 commit comments