From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754706AbcA1I20 (ORCPT ); Thu, 28 Jan 2016 03:28:26 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:23314 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750835AbcA1I2Y (ORCPT ); Thu, 28 Jan 2016 03:28:24 -0500 X-AuditID: cbfec7f4-f79026d00000418a-39-56a9d125ea96 From: Andrzej Hajda To: Andrew Morton , linux-kernel@vger.kernel.org (open list) Cc: Andrzej Hajda , Bartlomiej Zolnierkiewicz , Marek Szyprowski Subject: [PATCH v2] err.h: allow IS_ERR_VALUE to handle properly more types Date: Thu, 28 Jan 2016 09:27:28 +0100 Message-id: <1453969648-4036-1-git-send-email-a.hajda@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <201601072342.xanwLeaS%fengguang.wu@intel.com> References: <201601072342.xanwLeaS%fengguang.wu@intel.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpgluLIzCtJLcpLzFFi42I5/e/4ZV3ViyvDDDbOYrK4te4cq8Wc9WvY LDbOWM9qcXnXHDaLtUfusjuwepyY8ZvFo2/LKkaPz5vkApijuGxSUnMyy1KL9O0SuDL2zvrN XDBBr2L9qrlsDYxfNboYOTkkBEwkPnf2skPYYhIX7q1n62Lk4hASWMooMW9uFyOE08QksWL3 WlaQKjYBTYm/m2+ygdgiApESb1ufgHUwC/QxSjT+XQWWEBbwlri34AZTFyMHB4uAqsTrlniQ MK+Ak8Tn+R8YIbbJSZw8NhlsJqeAtcSaR4tYQGwhASuJHSuuME5g5F3AyLCKUTS1NLmgOCk9 11CvODG3uDQvXS85P3cTIyRcvuxgXHzM6hCjAAejEg8vQ9TKMCHWxLLiytxDjBIczEoivIrV QCHelMTKqtSi/Pii0pzU4kOM0hwsSuK8c3e9DxESSE8sSc1OTS1ILYLJMnFwSjUwuqTkRJvt k1A7sHfVq8vTuhMn866ZGyQ+JWcTq0HqhMlHA9S63aJT9nhN4WrUr9NYXvBa/jXTz8QzxYfK TO5EzT/Fwc+wxn72bjMtS6Or3MxzL/1/6+Sz1Gh2JvPm9TlV7/Rvp2xoY52p3GCnLROoE/HP qGjXSpMD92bujDfeffxc7K/Ttds+KbEUZyQaajEXFScCACcqkU4TAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Current implementation of IS_ERR_VALUE works correctly only with following types: - unsigned long, - short, int, long. Other types are handled incorrectly either on 32-bit either on 64-bit either on both architectures. The patch fixes it by comparing argument with MAX_ERRNO casted to argument's type for unsigned types and comparing with zero for signed types. As a result all integer types bigger than char are handled properly. I have analyzed usage of IS_ERR_VALUE using coccinelle and in about 35 cases it is used incorrectly, ie it can hide errors depending of 32/64 bit architecture. Instead of fixing usage I propose to enhance the macro to cover more types. And just for the record: the macro is used 101 times with signed variables, I am not sure if it should be preferred over simple comparison "ret < 0", but the new version can do it as well. And below list of detected potential errors: drivers/char/mem.c:698:45-46: WARNING: incorrect argument type in IS_ERR_VALUE(( unsigned long long ) offset) drivers/media/platform/soc_camera/atmel-isi.c:1089:21-22: WARNING: incorrect argument type in IS_ERR_VALUE(irq) drivers/net/ethernet/freescale/fs_enet/mac-scc.c:149:36-37: WARNING: incorrect argument type in IS_ERR_VALUE(fep -> ring_mem_addr) drivers/net/ethernet/freescale/ucc_geth.c:2237:48-49: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> tx_bd_ring_offset [ j ]) drivers/net/ethernet/freescale/ucc_geth.c:2314:48-49: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> rx_bd_ring_offset [ j ]) drivers/net/ethernet/freescale/ucc_geth.c:2524:44-45: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> tx_glbl_pram_offset) drivers/net/ethernet/freescale/ucc_geth.c:2544:45-46: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> thread_dat_tx_offset) drivers/net/ethernet/freescale/ucc_geth.c:2571:46-47: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> send_q_mem_reg_offset) drivers/net/ethernet/freescale/ucc_geth.c:2612:42-43: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> scheduler_offset) drivers/net/ethernet/freescale/ucc_geth.c:2659:54-55: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> tx_fw_statistics_pram_offset) drivers/net/ethernet/freescale/ucc_geth.c:2696:44-45: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> rx_glbl_pram_offset) drivers/net/ethernet/freescale/ucc_geth.c:2715:45-46: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> thread_dat_rx_offset) drivers/net/ethernet/freescale/ucc_geth.c:2736:54-55: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> rx_fw_statistics_pram_offset) drivers/net/ethernet/freescale/ucc_geth.c:2756:53-54: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> rx_irq_coalescing_tbl_offset) drivers/net/ethernet/freescale/ucc_geth.c:2822:44-45: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> rx_bd_qs_tbl_offset) drivers/net/ethernet/freescale/ucc_geth.c:2908:47-48: WARNING: incorrect argument type in IS_ERR_VALUE(ugeth -> exf_glbl_param_offset) drivers/net/ethernet/freescale/ucc_geth.c:292:36-37: WARNING: incorrect argument type in IS_ERR_VALUE(init_enet_offset) drivers/net/ethernet/freescale/ucc_geth.c:3042:39-40: WARNING: incorrect argument type in IS_ERR_VALUE(init_enet_pram_offset) drivers/soc/fsl/qe/ucc_fast.c:271:60-61: WARNING: incorrect argument type in IS_ERR_VALUE(uccf -> ucc_fast_tx_virtual_fifo_base_offset) drivers/soc/fsl/qe/ucc_fast.c:284:60-61: WARNING: incorrect argument type in IS_ERR_VALUE(uccf -> ucc_fast_rx_virtual_fifo_base_offset) drivers/soc/fsl/qe/ucc_slow.c:186:38-39: WARNING: incorrect argument type in IS_ERR_VALUE(uccs -> us_pram_offset) drivers/soc/fsl/qe/ucc_slow.c:213:38-39: WARNING: incorrect argument type in IS_ERR_VALUE(uccs -> rx_base_offset) drivers/soc/fsl/qe/ucc_slow.c:224:38-39: WARNING: incorrect argument type in IS_ERR_VALUE(uccs -> tx_base_offset) drivers/tty/serial/clps711x.c:471:29-30: WARNING: incorrect argument type in IS_ERR_VALUE(s -> port . irq) drivers/tty/serial/digicolor-usart.c:485:30-31: WARNING: incorrect argument type in IS_ERR_VALUE(dp -> port . irq) drivers/usb/gadget/udc/fsl_qe_udc.c:2369:26-27: WARNING: incorrect argument type in IS_ERR_VALUE(tmp_addr) drivers/video/fbdev/exynos/exynos_mipi_dsi.c:406:27-28: WARNING: incorrect argument type in IS_ERR_VALUE(dsim -> irq) net/ipv4/netfilter/arp_tables.c:1427:39-40: WARNING: incorrect argument type in IS_ERR_VALUE(iter1 -> counters . pcnt) net/ipv4/netfilter/arp_tables.c:530:34-35: WARNING: incorrect argument type in IS_ERR_VALUE(e -> counters . pcnt) net/ipv4/netfilter/ip_tables.c:1614:34-35: WARNING: incorrect argument type in IS_ERR_VALUE(e -> counters . pcnt) net/ipv4/netfilter/ip_tables.c:674:34-35: WARNING: incorrect argument type in IS_ERR_VALUE(e -> counters . pcnt) net/ipv6/netfilter/ip6_tables.c:1624:34-35: WARNING: incorrect argument type in IS_ERR_VALUE(e -> counters . pcnt) net/ipv6/netfilter/ip6_tables.c:687:34-35: WARNING: incorrect argument type in IS_ERR_VALUE(e -> counters . pcnt) drivers/net/ethernet/freescale/fs_enet/mac-fcc.c:110:35-36: WARNING: unknown argument type in IS_ERR_VALUE(fpi -> dpram_offset) Signed-off-by: Andrzej Hajda --- v2: - use '<= 0' instead of '< 0' to silence gcc verbose warnings, - expand commit message. --- include/linux/err.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/linux/err.h b/include/linux/err.h index 56762ab..43a6adb 100644 --- a/include/linux/err.h +++ b/include/linux/err.h @@ -18,7 +18,9 @@ #ifndef __ASSEMBLY__ -#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) +#define IS_ERR_VALUE(x) ((typeof(x))(-1) <= 0 \ + ? unlikely((x) < 0) \ + : unlikely((x) >= (typeof(x))-MAX_ERRNO)) static inline void * __must_check ERR_PTR(long error) { -- 1.9.1