From d894770ee3dacade2fff5770cb0444f77355998a Mon Sep 17 00:00:00 2001 From: Ivo Raisr Date: Sun, 29 May 2016 09:29:28 +0000 Subject: [PATCH] Solaris: Add ioctl wrappers for DINFOUSRLD and DINFOIDENT. n-i-bz git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15884 --- coregrind/m_syswrap/syswrap-solaris.c | 26 +++++++++++++++---- include/vki/vki-solaris.h | 6 +++++ memcheck/tests/solaris/scalar_ioctl.c | 20 ++++++++++++++ .../tests/solaris/scalar_ioctl.stderr.exp | 21 +++++++++++++++ 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c index 200e1f8776..4976f33d5b 100644 --- a/coregrind/m_syswrap/syswrap-solaris.c +++ b/coregrind/m_syswrap/syswrap-solaris.c @@ -826,7 +826,7 @@ static void door_record_client(ThreadId tid, Int fd, } /* Revokes an open door, be it server side or client side. */ -static void door_revoke(ThreadId tid, Int fd) +static void door_record_revoke(ThreadId tid, Int fd) { OpenDoor *d = doors_recorded; @@ -850,7 +850,7 @@ static void door_revoke(ThreadId tid, Int fd) } /* Attaches a server door to a filename. */ -static void door_server_fattach(Int fd, HChar *pathname) +static void door_record_server_fattach(Int fd, HChar *pathname) { OpenDoor *d = doors_recorded; @@ -1783,7 +1783,7 @@ PRE(sys_close) POST(sys_close) { WRAPPER_POST_NAME(generic, sys_close)(tid, arrghs, status); - door_revoke(tid, ARG1); + door_record_revoke(tid, ARG1); /* Possibly an explicitly open'ed client door fd was just closed. Generic sys_close wrapper calls this only if VG_(clo_track_fds) = True. */ if (!VG_(clo_track_fds)) @@ -2278,7 +2278,8 @@ POST(sys_mount) (ARG6 == sizeof(struct vki_namefd)) && ML_(safe_to_deref)((void *) ARG5, ARG6)) { /* Most likely an fattach() call for a door file descriptor. */ - door_server_fattach(((struct vki_namefd *) ARG5)->fd, (HChar *) ARG2); + door_record_server_fattach(((struct vki_namefd *) ARG5)->fd, + (HChar *) ARG2); } } } @@ -3021,6 +3022,7 @@ PRE(sys_ioctl) switch (cmd /*request*/) { /* Handle 2-arg specially here (they do not use ARG3 at all). */ + case VKI_DINFOIDENT: case VKI_TIOCNOTTY: case VKI_TIOCSCTTY: PRINT("sys_ioctl ( %ld, %#lx )", SARG1, ARG2); @@ -3295,6 +3297,13 @@ PRE(sys_ioctl) } break; + /* devinfo */ + case VKI_DINFOUSRLD: + /* We should do PRE_MEM_WRITE here but the question is for how many? */ + break; + case VKI_DINFOIDENT: + break; + default: ML_(PRE_unknown_ioctl)(tid, ARG2, ARG3); break; @@ -3497,6 +3506,13 @@ POST(sys_ioctl) case VKI_DTRACEHIOC_ADDDOF: break; + /* devinfo */ + case VKI_DINFOUSRLD: + POST_MEM_WRITE(ARG3, RES); + break; + case VKI_DINFOIDENT: + break; + default: /* Not really anything to do since ioctl direction hints are hardly used on Solaris. */ @@ -9266,7 +9282,7 @@ POST(sys_door) door_record_server(tid, ARG1, RES); break; case VKI_DOOR_REVOKE: - door_revoke(tid, ARG1); + door_record_revoke(tid, ARG1); if (VG_(clo_track_fds)) ML_(record_fd_close)(ARG1); break; diff --git a/include/vki/vki-solaris.h b/include/vki/vki-solaris.h index 33cce9134d..6db5246a28 100644 --- a/include/vki/vki-solaris.h +++ b/include/vki/vki-solaris.h @@ -345,6 +345,12 @@ typedef struct vki_kcf_door_arg_s { #define vki_crypto_get_provider_list_t crypto_get_provider_list_t +#include +#include +#define VKI_DINFOUSRLD DINFOUSRLD +#define VKI_DINFOIDENT DINFOIDENT + + #include #define VKI_MAXGETDENTS_SIZE MAXGETDENTS_SIZE #define vki_dirent dirent diff --git a/memcheck/tests/solaris/scalar_ioctl.c b/memcheck/tests/solaris/scalar_ioctl.c index abd45fc03e..855c5ff941 100644 --- a/memcheck/tests/solaris/scalar_ioctl.c +++ b/memcheck/tests/solaris/scalar_ioctl.c @@ -6,6 +6,8 @@ #include #include +#include +#include #include #include #include /* for _ST_FSTYPSZ */ @@ -458,6 +460,20 @@ static void sys_ioctl_DTRACEHIOC_ADDDOF(void) SY(SYS_ioctl, x0 - 1, x0 + DTRACEHIOC_ADDDOF, x0 + &dh); FAIL; } +__attribute__((noinline)) +static void sys_ioctl_DINFOUSRLD(void) +{ + GO(SYS_ioctl, "(DINFOUSRLD) 3s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + DINFOUSRLD, x0 + 1); FAIL; +} + +__attribute__((noinline)) +static void sys_ioctl_DINFOIDENT(void) +{ + GO(SYS_ioctl, "(DINFOIDENT) 2s 0m"); + SY(SYS_ioctl, x0 - 1, x0 + DINFOIDENT); FAIL; +} + int main(void) { /* Uninitialised, but we know px[0] is 0x0. */ @@ -527,6 +543,10 @@ int main(void) sys_ioctl_DTRACEHIOC_REMOVE(); sys_ioctl_DTRACEHIOC_ADDDOF(); + /* devinfo */ + sys_ioctl_DINFOUSRLD(); + sys_ioctl_DINFOIDENT(); + return 0; } diff --git a/memcheck/tests/solaris/scalar_ioctl.stderr.exp b/memcheck/tests/solaris/scalar_ioctl.stderr.exp index c3593b8364..74546391b2 100644 --- a/memcheck/tests/solaris/scalar_ioctl.stderr.exp +++ b/memcheck/tests/solaris/scalar_ioctl.stderr.exp @@ -875,3 +875,24 @@ Syscall param ioctl(DTRACEHIOC_ADDDOF, dh->dofhp_dof points to uninitialised byt ... Address 0x........ is on thread 1's stack +--------------------------------------------------------- + 54: SYS_ioctl (DINFOUSRLD) 3s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + +Syscall param ioctl(arg) contains uninitialised byte(s) + ... + +--------------------------------------------------------- + 54: SYS_ioctl (DINFOIDENT) 2s 0m +--------------------------------------------------------- +Syscall param ioctl(fd) contains uninitialised byte(s) + ... + +Syscall param ioctl(request) contains uninitialised byte(s) + ... + -- 2.47.2