History

Fix compat_sys_sigpending breakage

The latest change of compat_sys_sigpending in commit 8f13621abced ("sigpending(): move compat to native") has broken it in two ways. First, it tries to write 4 bytes more than userspace expects: sizeof(old_sigset_t) == sizeof(long) == 8 instead of sizeof(compat_old_sigset_t) == sizeof(u32) == 4. Second, on big endian architectures these bytes are being written in the wrong order. This bug was found by strace test suite.

Dmitry V. Levin committed 9 years ago

Commit fbb77611 parent 0fdd9511 file · +7 −4Browse files

Unified · Split

kernel/signal.c+7−4
@@ -3303,12 +3303,15 @@ SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) · 3302 unmodified lines
3303#ifdef CONFIG_COMPAT3303#ifdef CONFIG_COMPAT
3304COMPAT_SYSCALL_DEFINE1(sigpending, compat_old_sigset_t __user *, set32)3304COMPAT_SYSCALL_DEFINE1(sigpending, compat_old_sigset_t __user *, set32)
3305{3305{
3306#ifdef __BIG_ENDIAN
3306 sigset_t set;3307 sigset_t set;
3307 int err = do_sigpending(&set, sizeof(old_sigset_t)); 3308 int err = do_sigpending(&set, sizeof(set.sig[0]));
3308 if (err == 0)3309 if (!err)
3309 if (copy_to_user(set32, &set, sizeof(old_sigset_t)))3310 err = put_user(set.sig[0], set32);
3310 err = -EFAULT;
3311 return err;3311 return err;
3312#else
3313 return sys_rt_sigpending((sigset_t __user *)set32, sizeof(*set32));
3314#endif
3312}3315}
3313#endif3316#endif
3314 3317

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t