Commit b6e47f3c authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Russell King (Oracle)
Browse files

ARM: 9109/1: oabi-compat: add epoll_pwait handler



The epoll_wait() syscall has a special version for OABI compat
mode to convert the arguments to the EABI structure layout
of the kernel. However, the later epoll_pwait() syscall was
added in arch/arm in linux-2.6.32 without this conversion.

Use the same kind of handler for both.

Fixes: 36984265 ("ARM: 5677/1: ARM support for TIF_RESTORE_SIGMASK/pselect6/ppoll/epoll_pwait")
Cc: stable@vger.kernel.org
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
parent 344179fc
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -265,8 +265,7 @@ asmlinkage long sys_oabi_epoll_ctl(int epfd, int op, int fd,
	return do_epoll_ctl(epfd, op, fd, &kernel, false);
}

asmlinkage long sys_oabi_epoll_wait(int epfd,
				    struct oabi_epoll_event __user *events,
static long do_oabi_epoll_wait(int epfd, struct oabi_epoll_event __user *events,
			       int maxevents, int timeout)
{
	struct epoll_event *kbuf;
@@ -314,6 +313,39 @@ asmlinkage long sys_oabi_epoll_wait(int epfd,
}
#endif

SYSCALL_DEFINE4(oabi_epoll_wait, int, epfd,
		struct oabi_epoll_event __user *, events,
		int, maxevents, int, timeout)
{
	return do_oabi_epoll_wait(epfd, events, maxevents, timeout);
}

/*
 * Implement the event wait interface for the eventpoll file. It is the kernel
 * part of the user space epoll_pwait(2).
 */
SYSCALL_DEFINE6(oabi_epoll_pwait, int, epfd,
		struct oabi_epoll_event __user *, events, int, maxevents,
		int, timeout, const sigset_t __user *, sigmask,
		size_t, sigsetsize)
{
	int error;

	/*
	 * If the caller wants a certain signal mask to be set during the wait,
	 * we apply it here.
	 */
	error = set_user_sigmask(sigmask, sigsetsize);
	if (error)
		return error;

	error = do_oabi_epoll_wait(epfd, events, maxevents, timeout);
	restore_saved_sigmask_unless(error == -EINTR);

	return error;
}
#endif

struct oabi_sembuf {
	unsigned short	sem_num;
	short		sem_op;
+1 −1
Original line number Diff line number Diff line
@@ -360,7 +360,7 @@
343	common	vmsplice		sys_vmsplice
344	common	move_pages		sys_move_pages
345	common	getcpu			sys_getcpu
346	common	epoll_pwait		sys_epoll_pwait
346	common	epoll_pwait		sys_epoll_pwait		sys_oabi_epoll_pwait
347	common	kexec_load		sys_kexec_load
348	common	utimensat		sys_utimensat_time32
349	common	signalfd		sys_signalfd