From: Tom Hughes Date: Wed, 17 Jul 2013 13:25:08 +0000 (+0000) Subject: Add support for open_by_handle_at and fix name_to_handle_at X-Git-Tag: svn/VALGRIND_3_9_0~232 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6754a87d670ede17b94db8a0d38574fabf19aed4;p=thirdparty%2Fvalgrind.git Add support for open_by_handle_at and fix name_to_handle_at to check the file handle argument correctly. BZ#316761. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13459 --- diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 0aeffaae86..2bb4e9fcb6 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -176,6 +176,7 @@ 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_open_by_handle_at); DECL_TEMPLATE(linux, sys_add_key); DECL_TEMPLATE(linux, sys_request_key); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 13451135c9..b74fc87ab6 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -1072,7 +1072,7 @@ static SyscallTableEntry syscall_table[] = { // LINX_(__NR_fanotify_mark, sys_ni_syscall), // 301 LINXY(__NR_prlimit64, sys_prlimit64), // 302 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 303 -// LINX_(__NR_open_by_handle_at, sys_ni_syscall), // 304 + LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 304 // LINX_(__NR_clock_adjtime, sys_ni_syscall), // 305 // LINX_(__NR_syncfs, sys_ni_syscall), // 306 diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c index 40bb4b5d49..0ee94e7e13 100644 --- a/coregrind/m_syswrap/syswrap-arm-linux.c +++ b/coregrind/m_syswrap/syswrap-arm-linux.c @@ -1221,7 +1221,10 @@ static SyscallTableEntry syscall_main_table[] = { LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 363 LINXY(__NR_perf_event_open, sys_perf_event_open), // 364 - LINXY(__NR_accept4, sys_accept4) // 366 + LINXY(__NR_accept4, sys_accept4), // 366 + + LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 370 + LINXY(__NR_open_by_handle_at, sys_open_by_handle_at) // 371 }; diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 039f8d4d9b..312f10d064 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -4408,19 +4408,47 @@ 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, + 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 ); + if (ML_(safe_to_deref)( (void*)ARG3, sizeof(struct vki_file_handle))) { + struct vki_file_handle *fh = (struct vki_file_handle *)ARG3; + PRE_MEM_READ( "name_to_handle_at(handle)", (Addr)&fh->handle_bytes, sizeof(fh->handle_bytes) ); + PRE_MEM_WRITE( "name_to_handle_at(handle)", (Addr)fh, sizeof(struct vki_file_handle) + fh->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 ); + struct vki_file_handle *fh = (struct vki_file_handle *)ARG3; + POST_MEM_WRITE( ARG3, sizeof(struct vki_file_handle) + fh->handle_bytes ); POST_MEM_WRITE( ARG4, sizeof(int) ); } +PRE(sys_open_by_handle_at) +{ + *flags |= SfMayBlock; + PRINT("sys_open_by_handle_at ( %ld, %#lx, %ld )", ARG1, ARG2, ARG3); + PRE_REG_READ3(int, "open_by_handle_at", + int, mountdirfd, + struct vki_file_handle *, handle, + int, flags); + PRE_MEM_READ( "open_by_handle_at(handle)", ARG2, sizeof(struct vki_file_handle) + ((struct vki_file_handle*)ARG2)->handle_bytes ); +} + +POST(sys_open_by_handle_at) +{ + vg_assert(SUCCESS); + if (!ML_(fd_allowed)(RES, "open_by_handle_at", tid, True)) { + VG_(close)(RES); + SET_STATUS_Failure( VKI_EMFILE ); + } else { + if (VG_(clo_track_fds)) + ML_(record_fd_open_with_given_name)(tid, RES, (HChar*)ARG2); + } +} + /* --------------------------------------------------------------------- p{read,write}v wrappers ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 3f0eae4905..38c5a91fbe 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1826,7 +1826,7 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_prlimit64, sys_prlimit64), // 340 LINXY(__NR_name_to_handle_at, sys_name_to_handle_at),// 341 -// LINX_(__NR_open_by_handle_at, sys_ni_syscall), // 342 + LINXY(__NR_open_by_handle_at, sys_open_by_handle_at),// 342 // LINX_(__NR_clock_adjtime, sys_ni_syscall), // 343 // LINX_(__NR_syncfs, sys_ni_syscall), // 344