Skip to content

Commit fcbc5a9

Browse files
sfrothwellpaulusmack
authored andcommitted
powerpc: Explicitly copy elements of pt_regs
Gcc 4.3 produced this warning: arch/powerpc/kernel/signal_64.c: In function 'restore_sigcontext': arch/powerpc/kernel/signal_64.c:161: warning: array subscript is above array bounds This is caused by us copying to aliases of elements of the pt_regs structure. Make those explicit. This adds one extra __get_user and unrolls a loop. Signed-off-by: Stephen Rothwell <[email protected]> Signed-off-by: Paul Mackerras <[email protected]>
1 parent 3420b5d commit fcbc5a9

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

arch/powerpc/kernel/signal_64.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,29 +170,29 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig,
170170
#endif
171171
unsigned long err = 0;
172172
unsigned long save_r13 = 0;
173-
elf_greg_t *gregs = (elf_greg_t *)regs;
174173
unsigned long msr;
175-
int i;
176174

177175
/* If this is not a signal return, we preserve the TLS in r13 */
178176
if (!sig)
179177
save_r13 = regs->gpr[13];
180178

181-
/* copy everything before MSR */
182-
err |= __copy_from_user(regs, &sc->gp_regs,
183-
PT_MSR*sizeof(unsigned long));
184-
179+
/* copy the GPRs */
180+
err |= __copy_from_user(regs->gpr, sc->gp_regs, sizeof(regs->gpr));
181+
err |= __get_user(regs->nip, &sc->gp_regs[PT_NIP]);
185182
/* get MSR separately, transfer the LE bit if doing signal return */
186183
err |= __get_user(msr, &sc->gp_regs[PT_MSR]);
187184
if (sig)
188185
regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
189-
186+
err |= __get_user(regs->orig_gpr3, &sc->gp_regs[PT_ORIG_R3]);
187+
err |= __get_user(regs->ctr, &sc->gp_regs[PT_CTR]);
188+
err |= __get_user(regs->link, &sc->gp_regs[PT_LNK]);
189+
err |= __get_user(regs->xer, &sc->gp_regs[PT_XER]);
190+
err |= __get_user(regs->ccr, &sc->gp_regs[PT_CCR]);
190191
/* skip SOFTE */
191-
for (i = PT_MSR+1; i <= PT_RESULT; i++) {
192-
if (i == PT_SOFTE)
193-
continue;
194-
err |= __get_user(gregs[i], &sc->gp_regs[i]);
195-
}
192+
err |= __get_user(regs->trap, &sc->gp_regs[PT_TRAP]);
193+
err |= __get_user(regs->dar, &sc->gp_regs[PT_DAR]);
194+
err |= __get_user(regs->dsisr, &sc->gp_regs[PT_DSISR]);
195+
err |= __get_user(regs->result, &sc->gp_regs[PT_RESULT]);
196196

197197
if (!sig)
198198
regs->gpr[13] = save_r13;

0 commit comments

Comments
 (0)