}
/* 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;
}
/* 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;
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))
(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);
}
}
}
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);
}
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;
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. */
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;
#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 */
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. */
sys_ioctl_DTRACEHIOC_REMOVE();
sys_ioctl_DTRACEHIOC_ADDDOF();
+ /* devinfo */
+ sys_ioctl_DINFOUSRLD();
+ sys_ioctl_DINFOIDENT();
+
return 0;
}
...
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)
+ ...
+