diff options
author | Sam Ravnborg <sam@ravnborg.org> | 2014-05-16 17:26:01 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-18 22:01:32 -0400 |
commit | c19ac3260c86199fd0339b719f44593c44b1d4f1 (patch) | |
tree | 0b7eb632c63a654993f586db02c24e301835a097 /arch/sparc | |
parent | abaff455f750594984030ec878537b7c1e39ffc6 (diff) |
sparc64: clean up compat_sigset_t.seta handling
Use compat_sigset_t rather than opencode the array
Drop "switch (_NSIG_WORDS)" as we know this is always 1
Introduce BUILD_BUG_ON() to catch if this changes
As a side-effect of this fix following sparse warnings:
signal32.c:220:60: warning: invalid access past the end of 'seta' (12 8)
signal32.c:220:42: warning: invalid access past the end of 'seta' (8 8)
signal32.c:219:60: warning: invalid access past the end of 'seta' (20 8)
signal32.c:219:42: warning: invalid access past the end of 'seta' (16 8)
signal32.c:218:60: warning: invalid access past the end of 'seta' (28 8)
signal32.c:218:42: warning: invalid access past the end of 'seta' (24 8)
signal32.c:309:68: warning: invalid access past the end of 'seta' (12 8)
signal32.c:309:46: warning: invalid access past the end of 'seta' (8 8)
signal32.c:308:68: warning: invalid access past the end of 'seta' (20 8)
signal32.c:308:46: warning: invalid access past the end of 'seta' (16 8)
signal32.c:307:68: warning: invalid access past the end of 'seta' (28 8)
signal32.c:307:46: warning: invalid access past the end of 'seta' (24 8)
They all pointed to code that was never executed - so no bugs fixed.
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/kernel/signal32.c | 55 |
1 files changed, 17 insertions, 38 deletions
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index ab33c99c8bc4..62deba7be1a9 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
@@ -146,7 +146,7 @@ void do_sigreturn32(struct pt_regs *regs) | |||
146 | unsigned int psr; | 146 | unsigned int psr; |
147 | unsigned pc, npc; | 147 | unsigned pc, npc; |
148 | sigset_t set; | 148 | sigset_t set; |
149 | unsigned seta[_COMPAT_NSIG_WORDS]; | 149 | compat_sigset_t seta; |
150 | int err, i; | 150 | int err, i; |
151 | 151 | ||
152 | /* Always make any pending restarted system calls return -EINTR */ | 152 | /* Always make any pending restarted system calls return -EINTR */ |
@@ -210,17 +210,13 @@ void do_sigreturn32(struct pt_regs *regs) | |||
210 | if (restore_rwin_state(compat_ptr(rwin_save))) | 210 | if (restore_rwin_state(compat_ptr(rwin_save))) |
211 | goto segv; | 211 | goto segv; |
212 | } | 212 | } |
213 | err |= __get_user(seta[0], &sf->info.si_mask); | 213 | err |= __get_user(seta.sig[0], &sf->info.si_mask); |
214 | err |= copy_from_user(seta+1, &sf->extramask, | 214 | err |= copy_from_user(&seta.sig[1], &sf->extramask, |
215 | (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); | 215 | (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); |
216 | if (err) | 216 | if (err) |
217 | goto segv; | 217 | goto segv; |
218 | switch (_NSIG_WORDS) { | 218 | |
219 | case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32); | 219 | set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); |
220 | case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32); | ||
221 | case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32); | ||
222 | case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32); | ||
223 | } | ||
224 | set_current_blocked(&set); | 220 | set_current_blocked(&set); |
225 | return; | 221 | return; |
226 | 222 | ||
@@ -304,12 +300,7 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | |||
304 | goto segv; | 300 | goto segv; |
305 | } | 301 | } |
306 | 302 | ||
307 | switch (_NSIG_WORDS) { | 303 | set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); |
308 | case 4: set.sig[3] = seta.sig[6] + (((long)seta.sig[7]) << 32); | ||
309 | case 3: set.sig[2] = seta.sig[4] + (((long)seta.sig[5]) << 32); | ||
310 | case 2: set.sig[1] = seta.sig[2] + (((long)seta.sig[3]) << 32); | ||
311 | case 1: set.sig[0] = seta.sig[0] + (((long)seta.sig[1]) << 32); | ||
312 | } | ||
313 | set_current_blocked(&set); | 304 | set_current_blocked(&set); |
314 | return; | 305 | return; |
315 | segv: | 306 | segv: |
@@ -418,7 +409,7 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, | |||
418 | void __user *tail; | 409 | void __user *tail; |
419 | int sigframe_size; | 410 | int sigframe_size; |
420 | u32 psr; | 411 | u32 psr; |
421 | unsigned int seta[_COMPAT_NSIG_WORDS]; | 412 | compat_sigset_t seta; |
422 | 413 | ||
423 | /* 1. Make sure everything is clean */ | 414 | /* 1. Make sure everything is clean */ |
424 | synchronize_user_stack(); | 415 | synchronize_user_stack(); |
@@ -482,18 +473,14 @@ static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, | |||
482 | err |= __put_user(0, &sf->rwin_save); | 473 | err |= __put_user(0, &sf->rwin_save); |
483 | } | 474 | } |
484 | 475 | ||
485 | switch (_NSIG_WORDS) { | 476 | /* If these change we need to know - assignments to seta relies on these sizes */ |
486 | case 4: seta[7] = (oldset->sig[3] >> 32); | 477 | BUILD_BUG_ON(_NSIG_WORDS != 1); |
487 | seta[6] = oldset->sig[3]; | 478 | BUILD_BUG_ON(_COMPAT_NSIG_WORDS != 2); |
488 | case 3: seta[5] = (oldset->sig[2] >> 32); | 479 | seta.sig[1] = (oldset->sig[0] >> 32); |
489 | seta[4] = oldset->sig[2]; | 480 | seta.sig[0] = oldset->sig[0]; |
490 | case 2: seta[3] = (oldset->sig[1] >> 32); | 481 | |
491 | seta[2] = oldset->sig[1]; | 482 | err |= __put_user(seta.sig[0], &sf->info.si_mask); |
492 | case 1: seta[1] = (oldset->sig[0] >> 32); | 483 | err |= __copy_to_user(sf->extramask, &seta.sig[1], |
493 | seta[0] = oldset->sig[0]; | ||
494 | } | ||
495 | err |= __put_user(seta[0], &sf->info.si_mask); | ||
496 | err |= __copy_to_user(sf->extramask, seta + 1, | ||
497 | (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); | 484 | (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); |
498 | 485 | ||
499 | if (!wsaved) { | 486 | if (!wsaved) { |
@@ -623,16 +610,8 @@ static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, | |||
623 | /* Setup sigaltstack */ | 610 | /* Setup sigaltstack */ |
624 | err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); | 611 | err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); |
625 | 612 | ||
626 | switch (_NSIG_WORDS) { | 613 | seta.sig[1] = (oldset->sig[0] >> 32); |
627 | case 4: seta.sig[7] = (oldset->sig[3] >> 32); | 614 | seta.sig[0] = oldset->sig[0]; |
628 | seta.sig[6] = oldset->sig[3]; | ||
629 | case 3: seta.sig[5] = (oldset->sig[2] >> 32); | ||
630 | seta.sig[4] = oldset->sig[2]; | ||
631 | case 2: seta.sig[3] = (oldset->sig[1] >> 32); | ||
632 | seta.sig[2] = oldset->sig[1]; | ||
633 | case 1: seta.sig[1] = (oldset->sig[0] >> 32); | ||
634 | seta.sig[0] = oldset->sig[0]; | ||
635 | } | ||
636 | err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t)); | 615 | err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t)); |
637 | 616 | ||
638 | if (!wsaved) { | 617 | if (!wsaved) { |