[PATCH] powerpc: Fix __clear_user() with KUAP enabled

Christophe Leroy christophe.leroy at c-s.fr
Tue Dec 10 03:31:58 AEDT 2019



Le 09/12/2019 à 14:26, Andrew Donnellan a écrit :
> On 9/12/19 10:50 pm, Christophe Leroy wrote:
>>> -extern unsigned long __clear_user(void __user *addr, unsigned long 
>>> size);
>>> +extern unsigned long clear_user_asm(void __user *addr, unsigned long 
>>> size);
>>>   static inline unsigned long clear_user(void __user *addr, unsigned 
>>> long size)
>>>   {
>>> @@ -409,12 +409,17 @@ static inline unsigned long clear_user(void 
>>> __user *addr, unsigned long size)
>>>       might_fault();
>>>       if (likely(access_ok(addr, size))) {
>>>           allow_write_to_user(addr, size);
>>> -        ret = __clear_user(addr, size);
>>> +        ret = clear_user_asm(addr, size);
>>>           prevent_write_to_user(addr, size);
>>>       }
>>
>> What about changing the above by the following ?
>>
>>         if (likely(access_ok(addr, size)))        ret = 
>> __clear_user(addr, size);
>>
>>>       return ret;
>>>   }
>>> +static inline unsigned long __clear_user(void __user *addr, unsigned 
>>> long size)
>>> +{
>>> +        return clear_user(addr, size);
>>> +}
>>> +
>>
>> Then
>>
>> static inline unsigned long __clear_user(void __user *addr, unsigned 
>> long size)
>> {
>>      allow_write_to_user(addr, size);
>>      ret = clear_user_asm(addr, size);
>>      prevent_write_to_user(addr, size);
>>
>>      return ret;
>> }
> 
> This is exactly the patch I initially wrote, I ran it past mpe privately 
> and he suggested aliasing clear_user() -> __clear_user() instead, as 
> there's not much point keeping a separate path around for a single user 
> for a basically non-existent performance gain.
> 

But other arches do call __clear_user() from clear_user() and do the 
access unlock / lock in __clear_user() (at least arm and x86/64).

I think it would be better to do the same way as other arches, 
especially as __clear_user() can be called from anywhere in the kernel, 
so I'd expect it to behave the same on all arches.

I don't see it as the separate path, to me it looks more like code 
refactoring. And it follows the same logic as many other functions in 
the kernel: __the_said_function() is the light version of 
the_said_function().

Christophe


More information about the Linuxppc-dev mailing list