Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 527973c8 authored by Helge Deller's avatar Helge Deller
Browse files

parisc: add kernel audit feature



Implement missing functions for parisc to provide kernel audit feature.

Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 61dbbaeb
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -287,6 +287,9 @@ config SYSVIPC_COMPAT
	def_bool y
	depends on COMPAT && SYSVIPC

config AUDIT_ARCH
	def_bool y

config HPUX
	bool "Support for HP-UX binaries"
	depends on !64BIT
+4 −0
Original line number Diff line number Diff line
@@ -19,5 +19,9 @@
#define user_stack_pointer(regs)	((regs)->gr[30])
unsigned long profile_pc(struct pt_regs *);

static inline unsigned long regs_return_value(struct pt_regs *regs)
{
	return regs->gr[20];
}

#endif
+3 −1
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ struct thread_info {
#define TIF_32BIT               4       /* 32 bit binary */
#define TIF_MEMDIE		5	/* is terminating due to OOM killer */
#define TIF_RESTORE_SIGMASK	6	/* restore saved signal mask */
#define TIF_SYSCALL_AUDIT	7	/* syscall auditing active */
#define TIF_NOTIFY_RESUME	8	/* callback before returning to user */
#define TIF_SINGLESTEP		9	/* single stepping? */
#define TIF_BLOCKSTEP		10	/* branch stepping? */
@@ -68,6 +69,7 @@ struct thread_info {
#define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
#define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG)
#define _TIF_32BIT		(1 << TIF_32BIT)
#define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
#define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
#define _TIF_SINGLESTEP		(1 << TIF_SINGLESTEP)
#define _TIF_BLOCKSTEP		(1 << TIF_BLOCKSTEP)
@@ -75,7 +77,7 @@ struct thread_info {
#define _TIF_USER_WORK_MASK     (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | \
                                 _TIF_NEED_RESCHED)
#define _TIF_SYSCALL_TRACE_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP |	\
				 _TIF_BLOCKSTEP)
				 _TIF_BLOCKSTEP | _TIF_SYSCALL_AUDIT)

#endif /* __KERNEL__ */

+3 −1
Original line number Diff line number Diff line
@@ -29,7 +29,9 @@ obj-$(CONFIG_PCI) += pci.o
obj-$(CONFIG_MODULES)	+= module.o
obj-$(CONFIG_64BIT)	+= binfmt_elf32.o sys_parisc32.o signal32.o
obj-$(CONFIG_STACKTRACE)+= stacktrace.o
obj-$(CONFIG_AUDIT)	+= audit.o
obj64-$(CONFIG_AUDIT)	+= compat_audit.o
# only supported for PCX-W/U in 64-bit mode at the moment
obj-$(CONFIG_64BIT)	+= perf.o perf_asm.o
obj-$(CONFIG_64BIT)	+= perf.o perf_asm.o $(obj64-y)
obj-$(CONFIG_FUNCTION_TRACER)		+= ftrace.o
obj-$(CONFIG_FUNCTION_GRAPH_TRACER)	+= ftrace.o
+81 −0
Original line number Diff line number Diff line
#include <linux/init.h>
#include <linux/types.h>
#include <linux/audit.h>
#include <asm/unistd.h>

static unsigned dir_class[] = {
#include <asm-generic/audit_dir_write.h>
~0U
};

static unsigned read_class[] = {
#include <asm-generic/audit_read.h>
~0U
};

static unsigned write_class[] = {
#include <asm-generic/audit_write.h>
~0U
};

static unsigned chattr_class[] = {
#include <asm-generic/audit_change_attr.h>
~0U
};

static unsigned signal_class[] = {
#include <asm-generic/audit_signal.h>
~0U
};

int audit_classify_arch(int arch)
{
#ifdef CONFIG_COMPAT
	if (arch == AUDIT_ARCH_PARISC)
		return 1;
#endif
	return 0;
}

int audit_classify_syscall(int abi, unsigned syscall)
{
#ifdef CONFIG_COMPAT
	extern int parisc32_classify_syscall(unsigned);
	if (abi == AUDIT_ARCH_PARISC)
		return parisc32_classify_syscall(syscall);
#endif
	switch (syscall) {
	case __NR_open:
		return 2;
	case __NR_openat:
		return 3;
	case __NR_execve:
		return 5;
	default:
		return 0;
	}
}

static int __init audit_classes_init(void)
{
#ifdef CONFIG_COMPAT
	extern __u32 parisc32_dir_class[];
	extern __u32 parisc32_write_class[];
	extern __u32 parisc32_read_class[];
	extern __u32 parisc32_chattr_class[];
	extern __u32 parisc32_signal_class[];
	audit_register_class(AUDIT_CLASS_WRITE_32, parisc32_write_class);
	audit_register_class(AUDIT_CLASS_READ_32, parisc32_read_class);
	audit_register_class(AUDIT_CLASS_DIR_WRITE_32, parisc32_dir_class);
	audit_register_class(AUDIT_CLASS_CHATTR_32, parisc32_chattr_class);
	audit_register_class(AUDIT_CLASS_SIGNAL_32, parisc32_signal_class);
#endif
	audit_register_class(AUDIT_CLASS_WRITE, write_class);
	audit_register_class(AUDIT_CLASS_READ, read_class);
	audit_register_class(AUDIT_CLASS_DIR_WRITE, dir_class);
	audit_register_class(AUDIT_CLASS_CHATTR, chattr_class);
	audit_register_class(AUDIT_CLASS_SIGNAL, signal_class);
	return 0;
}

__initcall(audit_classes_init);
Loading