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

Commit c05c2ec9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull parisc fixes from Helge Deller:
 "Fix seccomp filter support and SIGSYS signals on compat kernel.

  Both patches are tagged for v4.5 stable kernel"

* 'parisc-4.6-2' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux:
  parisc: Fix and enable seccomp filter support
  parisc: Fix SIGSYS signals in compat case
parents e9dcfaff 910cd32e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ config PARISC
	select TTY # Needed for pdc_cons.c
	select HAVE_DEBUG_STACKOVERFLOW
	select HAVE_ARCH_AUDITSYSCALL
	select HAVE_ARCH_SECCOMP_FILTER
	select ARCH_NO_COHERENT_DMA_MMAP

	help
+7 −0
Original line number Diff line number Diff line
@@ -183,6 +183,13 @@ typedef struct compat_siginfo {
			int _band;      /* POLL_IN, POLL_OUT, POLL_MSG */
			int _fd;
		} _sigpoll;

		/* SIGSYS */
		struct {
			compat_uptr_t _call_addr; /* calling user insn */
			int _syscall;	/* triggering system call number */
			compat_uint_t _arch;	/* AUDIT_ARCH_* of syscall */
		} _sigsys;
	} _sifields;
} compat_siginfo_t;

+13 −0
Original line number Diff line number Diff line
@@ -39,6 +39,19 @@ static inline void syscall_get_arguments(struct task_struct *tsk,
	}
}

static inline void syscall_set_return_value(struct task_struct *task,
					    struct pt_regs *regs,
					    int error, long val)
{
	regs->gr[28] = error ? error : val;
}

static inline void syscall_rollback(struct task_struct *task,
				    struct pt_regs *regs)
{
	/* do nothing */
}

static inline int syscall_get_arch(void)
{
	int arch = AUDIT_ARCH_PARISC;
+7 −2
Original line number Diff line number Diff line
@@ -270,7 +270,8 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
long do_syscall_trace_enter(struct pt_regs *regs)
{
	/* Do the secure computing check first. */
	secure_computing_strict(regs->gr[20]);
	if (secure_computing() == -1)
		return -1;

	if (test_thread_flag(TIF_SYSCALL_TRACE) &&
	    tracehook_report_syscall_entry(regs)) {
@@ -296,7 +297,11 @@ long do_syscall_trace_enter(struct pt_regs *regs)
			regs->gr[23] & 0xffffffff);

out:
	return regs->gr[20];
	/*
	 * Sign extend the syscall number to 64bit since it may have been
	 * modified by a compat ptrace call
	 */
	return (int) ((u32) regs->gr[20]);
}

void do_syscall_trace_exit(struct pt_regs *regs)
+5 −0
Original line number Diff line number Diff line
@@ -371,6 +371,11 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from)
			val = (compat_int_t)from->si_int;
			err |= __put_user(val, &to->si_int);
			break;
		case __SI_SYS >> 16:
			err |= __put_user(ptr_to_compat(from->si_call_addr), &to->si_call_addr);
			err |= __put_user(from->si_syscall, &to->si_syscall);
			err |= __put_user(from->si_arch, &to->si_arch);
			break;
		}
	}
	return err;
Loading