|
From: <sv...@va...> - 2009-04-17 03:38:05
|
Author: njn
Date: 2009-04-17 04:37:50 +0100 (Fri, 17 Apr 2009)
New Revision: 9566
Log:
Add support for csops and fcntl(F_ADDSIGS), from Filipe Cabecinhas.
Modified:
branches/DARWIN/coregrind/m_syswrap/priv_syswrap-darwin.h
branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c
branches/DARWIN/include/vki/vki-darwin.h
Modified: branches/DARWIN/coregrind/m_syswrap/priv_syswrap-darwin.h
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/priv_syswrap-darwin.h 2009-04-16 02:04:07 UTC (rev 9565)
+++ branches/DARWIN/coregrind/m_syswrap/priv_syswrap-darwin.h 2009-04-17 03:37:50 UTC (rev 9566)
@@ -120,6 +120,7 @@
DECL_TEMPLATE(darwin, sys_getdirentries64);
DECL_TEMPLATE(darwin, sys_statfs64);
DECL_TEMPLATE(darwin, sys_fstatfs64);
+DECL_TEMPLATE(darwin, sys_csops);
DECL_TEMPLATE(darwin, sys_auditon);
DECL_TEMPLATE(darwin, sys_pathconf);
DECL_TEMPLATE(darwin, sys_fpathconf);
Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c 2009-04-16 02:04:07 UTC (rev 9565)
+++ branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c 2009-04-17 03:37:50 UTC (rev 9566)
@@ -961,6 +961,7 @@
F(F_LOG2PHYS);
F(F_GETPATH);
F(F_PATHPKG_CHECK);
+ F(F_ADDSIGS);
default:
return "UNKNOWN";
}
@@ -1098,6 +1099,25 @@
PRE_MEM_RASCIIZ( "fcntl(F_PATHPKG_CHECK, pathbuf)", ARG3);
break;
+ case VKI_F_ADDSIGS: /* Add detached signatures (for code signing) */
+ PRINT("sys_fcntl ( %ld, %s )", ARG1, name_for_fcntl(ARG2));
+ PRE_REG_READ3(long, "fcntl",
+ unsigned int, fd, unsigned int, cmd,
+ vki_fsignatures_t *, sigs);
+
+ {
+ vki_fsignatures_t *fsigs = (vki_fsignatures_t*)ARG3;
+ PRE_FIELD_READ( "fcntl(F_ADDSIGS, fsigs->fs_blob_start)",
+ fsigs->fs_blob_start);
+ PRE_FIELD_READ( "fcntl(F_ADDSIGS, fsigs->fs_blob_size)",
+ fsigs->fs_blob_size);
+
+ if (fsigs->fs_blob_start)
+ PRE_MEM_READ( "fcntl(F_ADDSIGS, fsigs->fs_blob_start)",
+ (Addr)fsigs->fs_blob_start, fsigs->fs_blob_size);
+ }
+ break;
+
default:
PRINT("sys_fcntl ( %ld, %ld [??] )", ARG1, ARG2);
if (VG_(clo_trace_unknown_syscalls)) {
@@ -2912,7 +2932,32 @@
POST_MEM_WRITE( ARG2, sizeof(struct vki_statfs64) );
}
+PRE(sys_csops)
+{
+ PRINT("sys_csops ( %ld, %#lx, %#lx, %lu )", ARG1, ARG2, ARG3, ARG4);
+ PRE_REG_READ4(int, "csops",
+ vki_pid_t, pid, uint32_t, ops,
+ void *, useraddr, vki_size_t, usersize);
+ PRE_MEM_WRITE( "csops(addr)", ARG3, ARG4 );
+
+ // If the pid is ours, don't mark the program as KILL or HARD
+ // Maybe we should keep track of this for later calls to STATUS
+ if (!ARG1 || VG_(getpid)() == ARG1) {
+ switch (ARG2) {
+ case VKI_CS_OPS_MARKINVALID:
+ case VKI_CS_OPS_MARKHARD:
+ case VKI_CS_OPS_MARKKILL:
+ SET_STATUS_Success(0);
+ }
+ }
+}
+
+POST(sys_csops)
+{
+ POST_MEM_WRITE( ARG3, ARG4 );
+}
+
PRE(sys_auditon)
{
PRINT("sys_auditon ( %ld, %#lx, %ld )", ARG1, ARG2, ARG3);
@@ -7060,7 +7105,7 @@
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(166)), // old exportfs
// _____(__NR_mount),
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(168)), // old ustat
-// _____(__NR_csops),
+ MACXY(__NR_csops, sys_csops), // code-signing ops
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(170)), // old table
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(171)), // old wait3
_____(VG_DARWIN_SYSCALL_CONSTRUCT_UNIX(172)), // old rpause
Modified: branches/DARWIN/include/vki/vki-darwin.h
===================================================================
--- branches/DARWIN/include/vki/vki-darwin.h 2009-04-16 02:04:07 UTC (rev 9565)
+++ branches/DARWIN/include/vki/vki-darwin.h 2009-04-17 03:37:50 UTC (rev 9566)
@@ -290,6 +290,7 @@
#define VKI_F_NOCACHE F_NOCACHE
#define VKI_F_LOG2PHYS F_LOG2PHYS
#define VKI_F_GETPATH F_GETPATH
+#define VKI_F_ADDSIGS F_ADDSIGS
#define VKI_F_FULLFSYNC F_FULLFSYNC
#define VKI_F_PATHPKG_CHECK F_PATHPKG_CHECK
#define VKI_F_FREEZE_FS F_FREEZE_FS
@@ -302,7 +303,17 @@
#define vki_fstore fstore
#define vki_fbootstraptransfer fbootstraptransfer
#define vki_log2phys log2phys
+#define vki_fsignatures_t fsignatures_t
+// These constants aren't in a standard header, they are from the kernel code:
+// xnu-1228.3.13/bsd/sys/codesign.h
+// Mac OS X 10.5.6 - Darwin 9.6
+#define VKI_CS_OPS_STATUS 0 /* return status */
+#define VKI_CS_OPS_MARKINVALID 1 /* invalidate process */
+#define VKI_CS_OPS_MARKHARD 2 /* set HARD flag */
+#define VKI_CS_OPS_MARKKILL 3 /* set KILL flag (sticky) */
+#define VKI_CS_OPS_PIDPATH 4 /* get executable's pathname */
+#define VKI_CS_OPS_CDHASH 5 /* get code directory hash */
#include <sys/mman.h>
|