Thread (8 messages) flat view 8 messages, 3 authors, 2016-08-03

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=
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help