Int fd1 = ((Int*)arg3)[0];
Int fd2 = ((Int*)arg3)[1];
vg_assert(!sr_isError(res)); /* guaranteed by caller */
+ // @todo PJF this needs something like POST_newFd_RES for the two fds?
POST_MEM_WRITE( arg3, 2*sizeof(int) );
if (!ML_(fd_allowed)(fd1, "socketcall.socketpair", tid, True) ||
!ML_(fd_allowed)(fd2, "socketcall.socketpair", tid, True)) {
POST(sys_pipe)
{
Int p0, p1;
+ // @todo PJF this needs something like POST_newFd_RES for the two fds?
#if defined(SOLARIS_NEW_PIPE_SYSCALL)
int *fds = (int*)ARG1;
POST(sys_fcntl)
{
+ // @todo PJF we're missing
+ // F_DUP2FD_CLOEXEC F_DUP2FD_CLOFORK F_DUPFD_CLOFORK F_DUP3FD
switch (ARG2 /*cmd*/) {
case VKI_F_DUPFD:
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl(F_DUPFD)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
break;
case VKI_F_DUPFD_CLOEXEC:
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl(F_DUPFD_CLOEXEC)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
break;
case VKI_F_DUP2FD:
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl(F_DUP2FD)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
POST(sys_openat)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "openat", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
switch (ARG6 /*subcode*/) {
case VKI_DOOR_CREATE:
- door_record_server(tid, ARG1, RES);
+ POST_newFd_RES;
+ if (!ML_(fd_allowed)(RES, "door_create", tid, True)) {
+ VG_(close)(RES);
+ SET_STATUS_Failure( VKI_EMFILE );
+ } else {
+ door_record_server(tid, ARG1, RES);
+ }
break;
case VKI_DOOR_REVOKE:
door_record_revoke(tid, ARG1);