]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Solaris: Add ioctl wrappers for DINFOUSRLD and DINFOIDENT.
authorIvo Raisr <ivosh@ivosh.net>
Sun, 29 May 2016 09:29:28 +0000 (09:29 +0000)
committerIvo Raisr <ivosh@ivosh.net>
Sun, 29 May 2016 09:29:28 +0000 (09:29 +0000)
n-i-bz

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

coregrind/m_syswrap/syswrap-solaris.c
include/vki/vki-solaris.h
memcheck/tests/solaris/scalar_ioctl.c
memcheck/tests/solaris/scalar_ioctl.stderr.exp

index 200e1f8776751cc5b8a5051c5385394d82ba0f9c..4976f33d5badcfcad667dd257a4e460bc76367a7 100644 (file)
@@ -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;
index 33cce9134d49e9c935556567bd6f2865f86f329b..6db5246a28571d7a5497f46d2b26a64524636f95 100644 (file)
@@ -345,6 +345,12 @@ typedef struct vki_kcf_door_arg_s {
 #define vki_crypto_get_provider_list_t crypto_get_provider_list_t
 
 
+#include <sys/dditypes.h>
+#include <sys/devinfo_impl.h>
+#define VKI_DINFOUSRLD DINFOUSRLD
+#define VKI_DINFOIDENT DINFOIDENT
+
+
 #include <sys/dirent.h>
 #define VKI_MAXGETDENTS_SIZE MAXGETDENTS_SIZE
 #define vki_dirent dirent
index abd45fc03e93a0104ab1e96cbe9c0cd969789e15..855c5ff94189f58e287fb48a48243605870130b7 100644 (file)
@@ -6,6 +6,8 @@
 
 #include <net/if.h>
 #include <sys/crypto/ioctl.h>
+#include <sys/dditypes.h>
+#include <sys/devinfo_impl.h>
 #include <sys/dtrace.h>
 #include <sys/filio.h>
 #include <sys/stat.h>          /* 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;
 }
 
index c3593b8364f35970a94c945298dc0c4417acf423..74546391b2391831cb8d6b42ca56aa1774f33b9d 100644 (file)
@@ -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)
+   ...
+