]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement the name_to_handle_at system call for x86 and amd64.
authorTom Hughes <tom@compton.nu>
Sun, 3 Mar 2013 12:57:20 +0000 (12:57 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 3 Mar 2013 12:57:20 +0000 (12:57 +0000)
Based on patch from Asmadeus to fix BZ#308930.

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

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
include/vki/vki-linux.h

index dd3db5a06d441f4397d86828b96ddc50062def41..0aeffaae8645b21e35c2380e06d80fb935e24f64 100644 (file)
@@ -175,6 +175,7 @@ DECL_TEMPLATE(linux, sys_readlinkat);
 DECL_TEMPLATE(linux, sys_fchmodat);
 DECL_TEMPLATE(linux, sys_faccessat);
 DECL_TEMPLATE(linux, sys_utimensat);
+DECL_TEMPLATE(linux, sys_name_to_handle_at);
 
 DECL_TEMPLATE(linux, sys_add_key);
 DECL_TEMPLATE(linux, sys_request_key);
index ea762f3d409bf1fe4d84f6bfcd0f6737669b0fdf..82e67bdf454cefa08ee3f915d149edd8733de351 100644 (file)
@@ -1071,7 +1071,7 @@ static SyscallTableEntry syscall_table[] = {
 //   LINX_(__NR_fanotify_init,     sys_ni_syscall),       // 300
 //   LINX_(__NR_fanotify_mark,     sys_ni_syscall),       // 301
    LINXY(__NR_prlimit64,         sys_prlimit64),        // 302
-//   LINX_(__NR_name_to_handle_at, sys_ni_syscall),       // 303
+   LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 303
 //   LINX_(__NR_open_by_handle_at, sys_ni_syscall),       // 304
 
 //   LINX_(__NR_clock_adjtime,     sys_ni_syscall),       // 305
index ff532b194a9e36f80e442164b88da94e9132e258..dd6fcc5302d3088964f0b38368651a34639039ab 100644 (file)
@@ -4403,6 +4403,24 @@ PRE(sys_faccessat)
    PRE_MEM_RASCIIZ( "faccessat(pathname)", ARG2 );
 }
 
+PRE(sys_name_to_handle_at)
+{
+   PRINT("sys_name_to_handle_at ( %ld, %#lx(%s), %#lx, %#lx, %ld )", ARG1, ARG2, (char*)ARG2, ARG3, ARG4, ARG5);
+   PRE_REG_READ5(int, "name_to_handle_at",
+                 int, dfd, const char *, name,
+                 struct vki_file_handle, handle,
+                 int *, mnt_id, int, flag);
+   PRE_MEM_RASCIIZ( "name_to_handle_at(name)", ARG2 );
+   PRE_MEM_WRITE( "name_to_handle_at(handle)", ARG3, sizeof(struct vki_file_handle) + ((struct vki_file_handle*)ARG3)->handle_bytes );
+   PRE_MEM_WRITE( "name_to_handle_at(mnt_id)", ARG4, sizeof(int) );
+}
+
+POST(sys_name_to_handle_at)
+{
+   POST_MEM_WRITE( ARG3, sizeof(struct vki_file_handle) + ((struct vki_file_handle*)ARG3)->handle_bytes );
+   POST_MEM_WRITE( ARG4, sizeof(int) );
+}
+
 /* ---------------------------------------------------------------------
    p{read,write}v wrappers
    ------------------------------------------------------------------ */
index 6b0a288946cf059927a225d8fcf06085bec8d2d1..7e7589930f20e2dc35fad593739b0f5fe5d92f2a 100644 (file)
@@ -1814,7 +1814,7 @@ static SyscallTableEntry syscall_table[] = {
 //   LINX_(__NR_fanotify_mark,     sys_ni_syscall),       // 339
 
    LINXY(__NR_prlimit64,         sys_prlimit64),        // 340
-//   LINX_(__NR_name_to_handle_at, sys_ni_syscall),       // 341
+   LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 341
 //   LINX_(__NR_open_by_handle_at, sys_ni_syscall),       // 342
 //   LINX_(__NR_clock_adjtime,     sys_ni_syscall),       // 343
 //   LINX_(__NR_syncfs,            sys_ni_syscall),       // 344
index 60282ae88b9c42cfede1f5d8122de37210b45ead..05d994bae76400a6e38d4d38cbacaeaa626dc637 100644 (file)
@@ -3106,6 +3106,17 @@ struct vki_xen_privcmd_mmapbatch_v2 {
 #define VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH    _VKI_IOC(_VKI_IOC_NONE, 'P', 3, sizeof(struct vki_xen_privcmd_mmapbatch))
 #define VKI_XEN_IOCTL_PRIVCMD_MMAPBATCH_V2 _VKI_IOC(_VKI_IOC_NONE, 'P', 4, sizeof(struct vki_xen_privcmd_mmapbatch_v2))
 
+//----------------------------------------------------------------------
+// From linux-3.4.0/include/linux/fs.h
+//----------------------------------------------------------------------
+
+struct vki_file_handle {
+   __vki_u32 handle_bytes;
+   int handle_type;
+   /* file identifier */
+   unsigned char f_handle[0];
+};
+
 #endif // __VKI_LINUX_H
 
 /*--------------------------------------------------------------------*/