Re: [v4] Fix to avoid IS_ERR_VALUE and IS_ERR abuses on 64bit systems.
From: Scott Wood <hidden>
Date: 2016-08-02 20:30:18
Also in:
linux-wireless, netdev
On 08/02/2016 10:34 AM, arvind Yadav wrote:=0A=
=0A= =0A= On Tuesday 02 August 2016 01:15 PM, Arnd Bergmann wrote:=0A=quoted
On Monday, August 1, 2016 4:55:43 PM CEST Scott Wood wrote:=0A=quoted
On 08/01/2016 02:02 AM, Arnd Bergmann wrote:=0A=quoted
quoted
diff --git a/include/linux/err.h b/include/linux/err.h=0A= index 1e35588..c2a2789 100644=0A= --- a/include/linux/err.h=0A= +++ b/include/linux/err.h=0A=@@ -18,7 +18,17 @@=0A= =0A= #ifndef __ASSEMBLY__=0A= =0A= -#define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >=3D (un=
signed long)-MAX_ERRNO)=0A=
quoted
quoted
quoted
quoted
+#define IS_ERR_VALUE(x) unlikely(is_error_check(x))=0A= +=0A= +static inline int is_error_check(unsigned long error)=0A=Please leave the existing macro alone. I think you were looking for=0A= something specific to the return code of qe_muram_alloc() function,=0A= so please add a helper in that subsystem if you need it, not in=0A= the generic header files.=0A=qe_muram_alloc (a.k.a. cpm_muram_alloc) returns unsigned long. The=0A= problem is certain callers that store the return value in a u32. Why=
=0A=
quoted
quoted
not just fix those callers to store it in unsigned long (at least until=
=0A=
quoted
quoted
error checking is done)?=0A= =0A=Yes, that would also address another problem with code like=0A= =0A= kfree((void *)ugeth->tx_bd_ring_offset[i]);=0A= =0A= which is not 64-bit safe when tx_bd_ring_offset is a 32-bit value=0A= that also holds the return value of qe_muram_alloc.=0A=
=0A= Well, hopefully it doesn't hold a return of qe_muram_alloc() when it's=0A= being passed to kfree()...=0A= =0A= There's also the code that casts kmalloc()'s return to u32, etc.=0A= ucc_geth is not 64-bit clean in general.=0A= =0A=
quoted
=0A= Arnd=0A=Yes, we will fix caller. Caller api is not safe on 64bit.=0A=
=0A= The API is fine (or at least, I haven't seen a valid issue pointed out=0A= yet). The problem is the ucc_geth driver.=0A= =0A=
Even qe_muram_addr(a.k.a. cpm_muram_addr )passing value unsigned int,=0A= but it should be unsigned long.=0A=
=0A= cpm_muram_addr takes unsigned long as a parameter, not that it matters=0A= since you can't pass errors into it and a muram offset should never=0A= exceed 32 bits.=0A= =0A= -Scott=0A= =0A=