summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2005-12-23 11:58:42 +0000
committerphk <phk@FreeBSD.org>2005-12-23 11:58:42 +0000
commit213233d76c0df33000bc2595f9f352f7d3041680 (patch)
treedbed01ddde32dd5ebd12a08f5978e69705e0891e /sys
parent80e1c5a55d041cc755e763279ed18653841b626d (diff)
downloadFreeBSD-src-213233d76c0df33000bc2595f9f352f7d3041680.zip
FreeBSD-src-213233d76c0df33000bc2595f9f352f7d3041680.tar.gz
Regenerate sysent with new abort2 system call.
Implement abort2(const char *reason, int narg, void **args); Submitted by: "Wojciech A. Koszek" <dunstan@freebsd.czest.pl>
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/freebsd32/freebsd32_proto.h8
-rw-r--r--sys/compat/freebsd32/freebsd32_syscall.h5
-rw-r--r--sys/compat/freebsd32/freebsd32_syscalls.c11
-rw-r--r--sys/compat/freebsd32/freebsd32_sysent.c11
-rw-r--r--sys/kern/init_sysent.c3
-rw-r--r--sys/kern/kern_exit.c83
-rw-r--r--sys/kern/syscalls.c3
-rw-r--r--sys/sys/syscall.h5
-rw-r--r--sys/sys/syscall.mk5
-rw-r--r--sys/sys/sysproto.h8
10 files changed, 130 insertions, 12 deletions
diff --git a/sys/compat/freebsd32/freebsd32_proto.h b/sys/compat/freebsd32/freebsd32_proto.h
index b89f468..804909c 100644
--- a/sys/compat/freebsd32/freebsd32_proto.h
+++ b/sys/compat/freebsd32/freebsd32_proto.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.57 2005/10/26 22:19:51 peter Exp
+ * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.60 2005/12/23 11:56:39 phk Exp
*/
#ifndef _FREEBSD32_SYSPROTO_H_
@@ -272,6 +272,11 @@ struct freebsd32_swapcontext_args {
char oucp_l_[PADL_(struct freebsd32_ucontext *)]; struct freebsd32_ucontext * oucp; char oucp_r_[PADR_(struct freebsd32_ucontext *)];
char ucp_l_[PADL_(const struct freebsd32_ucontext *)]; const struct freebsd32_ucontext * ucp; char ucp_r_[PADR_(const struct freebsd32_ucontext *)];
};
+struct abort2_args {
+ char why_l_[PADL_(const char *)]; const char * why; char why_r_[PADR_(const char *)];
+ char nargs_l_[PADL_(int)]; int nargs; char nargs_r_[PADR_(int)];
+ char args_l_[PADL_(void **)]; void ** args; char args_r_[PADR_(void **)];
+};
int freebsd32_wait4(struct thread *, struct freebsd32_wait4_args *);
int freebsd32_recvmsg(struct thread *, struct freebsd32_recvmsg_args *);
int freebsd32_sendmsg(struct thread *, struct freebsd32_sendmsg_args *);
@@ -316,6 +321,7 @@ int freebsd32_sigreturn(struct thread *, struct freebsd32_sigreturn_args *);
int freebsd32_getcontext(struct thread *, struct freebsd32_getcontext_args *);
int freebsd32_setcontext(struct thread *, struct freebsd32_setcontext_args *);
int freebsd32_swapcontext(struct thread *, struct freebsd32_swapcontext_args *);
+int abort2(struct thread *, struct abort2_args *);
#ifdef COMPAT_43
diff --git a/sys/compat/freebsd32/freebsd32_syscall.h b/sys/compat/freebsd32/freebsd32_syscall.h
index b82fb17..ccb1668 100644
--- a/sys/compat/freebsd32/freebsd32_syscall.h
+++ b/sys/compat/freebsd32/freebsd32_syscall.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.57 2005/10/26 22:19:51 peter Exp
+ * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.60 2005/12/23 11:56:39 phk Exp
*/
#define FREEBSD32_SYS_syscall 0
@@ -310,4 +310,5 @@
#define FREEBSD32_SYS_thr_suspend 442
#define FREEBSD32_SYS_thr_wake 443
#define FREEBSD32_SYS_kldunloadf 444
-#define FREEBSD32_SYS_MAXSYSCALL 455
+#define FREEBSD32_SYS_abort2 463
+#define FREEBSD32_SYS_MAXSYSCALL 464
diff --git a/sys/compat/freebsd32/freebsd32_syscalls.c b/sys/compat/freebsd32/freebsd32_syscalls.c
index 69f28ce..1e016fd 100644
--- a/sys/compat/freebsd32/freebsd32_syscalls.c
+++ b/sys/compat/freebsd32/freebsd32_syscalls.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.57 2005/10/26 22:19:51 peter Exp
+ * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.60 2005/12/23 11:56:39 phk Exp
*/
const char *freebsd32_syscallnames[] = {
@@ -462,4 +462,13 @@ const char *freebsd32_syscallnames[] = {
"#452", /* 452 = setaudit_addr */
"#453", /* 453 = auditctl */
"#454", /* 454 = _umtx_op */
+ "#455", /* 455 = thr_new */
+ "#456", /* 456 = sigqueue */
+ "#457", /* 457 = mq_open */
+ "#458", /* 458 = mq_setattr */
+ "#459", /* 459 = mq_timedreceive */
+ "#460", /* 460 = mq_timedsend */
+ "#461", /* 461 = mq_notify */
+ "#462", /* 462 = mq_unlink */
+ "abort2", /* 463 = abort2 */
};
diff --git a/sys/compat/freebsd32/freebsd32_sysent.c b/sys/compat/freebsd32/freebsd32_sysent.c
index 8a7b038..7167409 100644
--- a/sys/compat/freebsd32/freebsd32_sysent.c
+++ b/sys/compat/freebsd32/freebsd32_sysent.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.57 2005/10/26 22:19:51 peter Exp
+ * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.60 2005/12/23 11:56:39 phk Exp
*/
#include "opt_compat.h"
@@ -487,4 +487,13 @@ struct sysent freebsd32_sysent[] = {
{ 0, (sy_call_t *)nosys, AUE_NULL }, /* 452 = setaudit_addr */
{ 0, (sy_call_t *)nosys, AUE_NULL }, /* 453 = auditctl */
{ 0, (sy_call_t *)nosys, AUE_NULL }, /* 454 = _umtx_op */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 455 = thr_new */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 456 = sigqueue */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 457 = mq_open */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 458 = mq_setattr */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 459 = mq_timedreceive */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 460 = mq_timedsend */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 461 = mq_notify */
+ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 462 = mq_unlink */
+ { SYF_MPSAFE | AS(abort2_args), (sy_call_t *)abort2, AUE_NULL }, /* 463 = abort2 */
};
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index 0bf661e..6d5cf40 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.205 2005/11/27 01:13:00 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.206 2005/12/23 11:54:11 phk Exp
*/
#include "opt_compat.h"
@@ -492,4 +492,5 @@ struct sysent sysent[] = {
{ SYF_MPSAFE | AS(mq_timedsend_args), (sy_call_t *)lkmressys, AUE_NULL }, /* 460 = mq_timedsend */
{ SYF_MPSAFE | AS(mq_notify_args), (sy_call_t *)lkmressys, AUE_NULL }, /* 461 = mq_notify */
{ SYF_MPSAFE | AS(mq_unlink_args), (sy_call_t *)lkmressys, AUE_NULL }, /* 462 = mq_unlink */
+ { SYF_MPSAFE | AS(abort2_args), (sy_call_t *)abort2, AUE_NULL }, /* 463 = abort2 */
};
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 024a1f7..56f800f 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -56,10 +56,12 @@ __FBSDID("$FreeBSD$");
#include <sys/vmmeter.h>
#include <sys/vnode.h>
#include <sys/resourcevar.h>
+#include <sys/sbuf.h>
#include <sys/signalvar.h>
#include <sys/sched.h>
#include <sys/sx.h>
#include <sys/syscallsubr.h>
+#include <sys/syslog.h>
#include <sys/ptrace.h>
#include <sys/acct.h> /* for acct_process() function prototype */
#include <sys/filedesc.h>
@@ -553,6 +555,87 @@ retry:
thread_exit();
}
+
+#ifndef _SYS_SYSPROTO_H_
+struct abort2_args {
+ char *why;
+ int nargs;
+ void **args;
+};
+#endif
+
+/*
+ * MPSAFE.
+ */
+int
+abort2(struct thread *td, struct abort2_args *uap)
+{
+ struct proc *p = td->td_proc;
+ struct sbuf *sb;
+ void *uargs[16];
+ int error, i, sig;
+
+ error = 0; /* satisfy compiler */
+
+ /*
+ * Do it right now so we can log either proper call of abort2(), or
+ * note, that invalid argument was passed. 512 is big enough to
+ * handle 16 arguments' descriptions with additional comments.
+ */
+ sb = sbuf_new(NULL, NULL, 512, SBUF_FIXEDLEN);
+ sbuf_clear(sb);
+ sbuf_printf(sb, "%s(pid %d uid %d) aborted: ",
+ p->p_comm, p->p_pid, td->td_ucred->cr_uid);
+ /*
+ * Since we can't return from abort2(), send SIGKILL in cases, where
+ * abort2() was called improperly
+ */
+ sig = SIGKILL;
+ /* Prevent from DoSes from user-space. */
+ if (uap->nargs < 0 || uap->nargs > 16)
+ goto out;
+ if (uap->args == NULL)
+ goto out;
+ error = copyin(uap->args, uargs, uap->nargs * sizeof(void *));
+ if (error != 0)
+ goto out;
+ /*
+ * Limit size of 'reason' string to 128. Will fit even when
+ * maximal number of arguments was chosen to be logged.
+ */
+ if (uap->why != NULL) {
+ error = sbuf_copyin(sb, uap->why, 128);
+ if (error < 0)
+ goto out;
+ } else {
+ sbuf_printf(sb, "(null)");
+ }
+ if (uap->nargs) {
+ sbuf_printf(sb, "(");
+ for (i = 0;i < uap->nargs; i++)
+ sbuf_printf(sb, "%s%p", i == 0 ? "" : ", ", uargs[i]);
+ sbuf_printf(sb, ")");
+ }
+ /*
+ * Final stage: arguments were proper, string has been
+ * successfully copied from userspace, and copying pointers
+ * from user-space succeed.
+ */
+ sig = SIGABRT;
+out:
+ if (sig == SIGKILL) {
+ sbuf_trim(sb);
+ sbuf_printf(sb, " (Reason text inaccessible)");
+ }
+ sbuf_cat(sb, "\n");
+ sbuf_finish(sb);
+ log(LOG_INFO, "%s", sbuf_data(sb));
+ sbuf_delete(sb);
+ exit1(td, W_EXITCODE(0, sig));
+ return (0);
+}
+
+
#ifdef COMPAT_43
/*
* The dirty work is handled by kern_wait().
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index dc9e172..33f4c45 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.205 2005/11/27 01:13:00 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.206 2005/12/23 11:54:11 phk Exp
*/
const char *syscallnames[] = {
@@ -470,4 +470,5 @@ const char *syscallnames[] = {
"mq_timedsend", /* 460 = mq_timedsend */
"mq_notify", /* 461 = mq_notify */
"mq_unlink", /* 462 = mq_unlink */
+ "abort2", /* 463 = abort2 */
};
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index aa12917..aab6b9c 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.205 2005/11/27 01:13:00 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.206 2005/12/23 11:54:11 phk Exp
*/
#define SYS_syscall 0
@@ -386,4 +386,5 @@
#define SYS_mq_timedsend 460
#define SYS_mq_notify 461
#define SYS_mq_unlink 462
-#define SYS_MAXSYSCALL 463
+#define SYS_abort2 463
+#define SYS_MAXSYSCALL 464
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index dc4832d..9dde20c 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -1,7 +1,7 @@
# FreeBSD system call names.
# DO NOT EDIT-- this file is automatically generated.
# $FreeBSD$
-# created from FreeBSD: src/sys/kern/syscalls.master,v 1.205 2005/11/27 01:13:00 davidxu Exp
+# created from FreeBSD: src/sys/kern/syscalls.master,v 1.206 2005/12/23 11:54:11 phk Exp
MIASM = \
syscall.o \
exit.o \
@@ -327,4 +327,5 @@ MIASM = \
mq_timedreceive.o \
mq_timedsend.o \
mq_notify.o \
- mq_unlink.o
+ mq_unlink.o \
+ abort2.o
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index 67c9764..57b56ef 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -3,7 +3,7 @@
*
* DO NOT EDIT-- this file is automatically generated.
* $FreeBSD$
- * created from FreeBSD: src/sys/kern/syscalls.master,v 1.205 2005/11/27 01:13:00 davidxu Exp
+ * created from FreeBSD: src/sys/kern/syscalls.master,v 1.206 2005/12/23 11:54:11 phk Exp
*/
#ifndef _SYS_SYSPROTO_H_
@@ -1435,6 +1435,11 @@ struct mq_notify_args {
struct mq_unlink_args {
char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
};
+struct abort2_args {
+ char why_l_[PADL_(const char *)]; const char * why; char why_r_[PADR_(const char *)];
+ char nargs_l_[PADL_(int)]; int nargs; char nargs_r_[PADR_(int)];
+ char args_l_[PADL_(void **)]; void ** args; char args_r_[PADR_(void **)];
+};
int nosys(struct thread *, struct nosys_args *);
void sys_exit(struct thread *, struct sys_exit_args *);
int fork(struct thread *, struct fork_args *);
@@ -1759,6 +1764,7 @@ int mq_timedreceive(struct thread *, struct mq_timedreceive_args *);
int mq_timedsend(struct thread *, struct mq_timedsend_args *);
int mq_notify(struct thread *, struct mq_notify_args *);
int mq_unlink(struct thread *, struct mq_unlink_args *);
+int abort2(struct thread *, struct abort2_args *);
#ifdef COMPAT_43
OpenPOWER on IntegriCloud