summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_descrip.c8
-rw-r--r--sys/kern/kern_ktrace.c32
-rw-r--r--sys/kern/uipc_syscalls.c36
-rw-r--r--sys/kern/vfs_syscalls.c12
4 files changed, 87 insertions, 1 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c
index 27a5289..7025587 100644
--- a/sys/kern/kern_descrip.c
+++ b/sys/kern/kern_descrip.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include "opt_compat.h"
#include "opt_ddb.h"
+#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -72,6 +73,9 @@ __FBSDID("$FreeBSD$");
#include <sys/unistd.h>
#include <sys/user.h>
#include <sys/vnode.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <security/audit/audit.h>
@@ -1126,6 +1130,10 @@ kern_fstat(struct thread *td, int fd, struct stat *sbp)
error = fo_stat(fp, sbp, td->td_ucred, td);
fdrop(fp, td);
+#ifdef KTRACE
+ if (error == 0 && KTRPOINT(td, KTR_STRUCT))
+ ktrstat(sbp);
+#endif
return (error);
}
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index f5385ea..c8e4451 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/unistd.h>
#include <sys/vnode.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
#include <sys/ktrace.h>
#include <sys/sx.h>
#include <sys/sysctl.h>
@@ -107,7 +109,8 @@ static int data_lengths[] = {
sizeof(struct ktr_genio), /* KTR_GENIO */
sizeof(struct ktr_psig), /* KTR_PSIG */
sizeof(struct ktr_csw), /* KTR_CSW */
- 0 /* KTR_USER */
+ 0, /* KTR_USER */
+ 0, /* KTR_STRUCT */
};
static STAILQ_HEAD(, ktr_request) ktr_free;
@@ -552,6 +555,33 @@ ktrcsw(out, user)
kc->user = user;
ktr_enqueuerequest(curthread, req);
}
+
+void
+ktrstruct(name, namelen, data, datalen)
+ const char *name;
+ size_t namelen;
+ void *data;
+ size_t datalen;
+{
+ struct ktr_request *req;
+ char *buf = NULL;
+ size_t buflen;
+
+ if (!data)
+ datalen = 0;
+ buflen = namelen + 1 + datalen;
+ buf = malloc(buflen, M_KTRACE, M_WAITOK);
+ bcopy(name, buf, namelen);
+ buf[namelen] = '\0';
+ bcopy(data, buf + namelen + 1, datalen);
+ if ((req = ktr_getrequest(KTR_STRUCT)) == NULL) {
+ free(buf, M_KTRACE);
+ return;
+ }
+ req->ktr_buffer = buf;
+ req->ktr_header.ktr_len = buflen;
+ ktr_submitrequest(curthread, req);
+}
#endif /* KTRACE */
/* Interface and common routines */
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 9709376..48e3bec 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -222,6 +222,10 @@ kern_bind(td, fd, sa)
if (error)
return (error);
so = fp->f_data;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(sa);
+#endif
#ifdef MAC
SOCK_LOCK(so);
error = mac_socket_check_bind(td->td_ucred, so, sa);
@@ -444,6 +448,10 @@ kern_accept(struct thread *td, int s, struct sockaddr **name,
/* check sa_len before it is destroyed */
if (*namelen > sa->sa_len)
*namelen = sa->sa_len;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(sa);
+#endif
*name = sa;
sa = NULL;
}
@@ -538,6 +546,10 @@ kern_connect(td, fd, sa)
error = EALREADY;
goto done1;
}
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(sa);
+#endif
#ifdef MAC
SOCK_LOCK(so);
error = mac_socket_check_connect(td->td_ucred, so, sa);
@@ -1052,6 +1064,10 @@ kern_recvit(td, s, mp, fromseg, controlp)
}
out:
fdrop(fp, td);
+#ifdef KTRACE
+ if (fromsa && KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(fromsa);
+#endif
if (fromsa)
FREE(fromsa, M_SONAME);
@@ -1456,6 +1472,10 @@ kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
else
len = MIN(*alen, (*sa)->sa_len);
*alen = len;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(*sa);
+#endif
bad:
fdrop(fp, td);
if (error && *sa) {
@@ -1553,6 +1573,10 @@ kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
else
len = MIN(*alen, (*sa)->sa_len);
*alen = len;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(*sa);
+#endif
bad:
if (error && *sa) {
free(*sa, M_SONAME);
@@ -2373,6 +2397,10 @@ sctp_generic_sendmsg (td, uap)
error = getsock(td->td_proc->p_fd, uap->sd, &fp, NULL);
if (error)
goto sctp_bad;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(to);
+#endif
iov[0].iov_base = uap->msg;
iov[0].iov_len = uap->mlen;
@@ -2476,6 +2504,10 @@ sctp_generic_sendmsg_iov(td, uap)
error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
if (error)
goto sctp_bad1;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(to);
+#endif
so = (struct socket *)fp->f_data;
#ifdef MAC
@@ -2659,6 +2691,10 @@ sctp_generic_recvmsg(td, uap)
goto out;
}
}
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrsockaddr(fromsa);
+#endif
if (uap->msg_flags) {
error = copyout(&msg_flags, uap->msg_flags, sizeof (int));
if (error) {
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index d05ca3a..8829a9c 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -38,6 +38,7 @@
__FBSDID("$FreeBSD$");
#include "opt_compat.h"
+#include "opt_ktrace.h"
#include "opt_mac.h"
#include <sys/param.h>
@@ -67,6 +68,9 @@ __FBSDID("$FreeBSD$");
#include <sys/jail.h>
#include <sys/syscallsubr.h>
#include <sys/sysctl.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <machine/stdarg.h>
@@ -2120,6 +2124,10 @@ kern_stat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp)
if (error)
return (error);
*sbp = sb;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrstat(&sb);
+#endif
return (0);
}
@@ -2171,6 +2179,10 @@ kern_lstat(struct thread *td, char *path, enum uio_seg pathseg, struct stat *sbp
if (error)
return (error);
*sbp = sb;
+#ifdef KTRACE
+ if (KTRPOINT(td, KTR_STRUCT))
+ ktrstat(&sb);
+#endif
return (0);
}
OpenPOWER on IntegriCloud