aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc
diff options
context:
space:
mode:
authorSam Ravnborg <sam@ravnborg.org>2014-05-16 17:26:01 -0400
committerDavid S. Miller <davem@davemloft.net>2014-05-18 22:01:32 -0400
commitc19ac3260c86199fd0339b719f44593c44b1d4f1 (patch)
tree0b7eb632c63a654993f586db02c24e301835a097 /arch/sparc
parentabaff455f750594984030ec878537b7c1e39ffc6 (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.c55
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;
315segv: 306segv:
@@ -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) {