Re: [PATCH v2 1/2] powerpc: Avoid signed to unsigned conversion in set_thread_tidr()
From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2017-11-27 03:48:22
Vaibhav Jain [off-list ref] writes:
There is an unsafe signed to unsigned conversion in set_thread_tidr() that may cause an error value to be assigned to SPRN_TIDR register and used as thread-id. The issue happens as assign_thread_tidr() returns an int and thread.tidr is an unsigned-long. So a negative error code returned from assign_thread_tidr() will fail the error check and gets assigned as tidr as a large positive value. To fix this the patch assigns the return value of assign_thread_tidr() to a temporary int and assigns it to thread.tidr iff its '> 0'. The patch shouldn't impact the calling convention of set_thread_tidr()
But it does? I'm really confused. Please fix and resend. cheers
int set_thread_tidr(struct task_struct *t)
{
+ int rc;
+
if (!cpu_has_feature(CPU_FTR_ARCH_300))
return -EINVAL; ^
-ve error
if (t != current) return -EINVAL;
^
-ve error
- t->thread.tidr = assign_thread_tidr(); - if (t->thread.tidr < 0) - return t->thread.tidr;
^
-ve error
Yes I know we never hit that case because of the bug, that is what this
patch should be fixing, and only that.
-
- mtspr(SPRN_TIDR, t->thread.tidr);
+ rc = assign_thread_tidr();
+ if (rc > 0) {
+ t->thread.tidr = rc;
+ mtspr(SPRN_TIDR, t->thread.tidr);
+ }
- return 0;Success == 0
+ return rc;
Success == +ve TIDR
}
cheers