17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only 2e8fa600eSJulia Lawall/// PTR_ERR should access the value just tested by IS_ERR 302da7b42SJulia Lawall//# There can be false positives in the patch case, where it is the call to 4e8fa600eSJulia Lawall//# IS_ERR that is wrong. 5e8fa600eSJulia Lawall/// 6e8fa600eSJulia Lawall// Confidence: High 77f904d7eSThomas Gleixner// Copyright: (C) 2012, 2015 Julia Lawall, INRIA. 87f904d7eSThomas Gleixner// Copyright: (C) 2012, 2015 Gilles Muller, INRIA. 9*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website 1093f14468SNicolas Palix// Options: --no-includes --include-headers 11e8fa600eSJulia Lawall 12e8fa600eSJulia Lawallvirtual patch 13e8fa600eSJulia Lawallvirtual context 14e8fa600eSJulia Lawallvirtual org 15e8fa600eSJulia Lawallvirtual report 16e8fa600eSJulia Lawall 1702da7b42SJulia Lawall@ok1 exists@ 1802da7b42SJulia Lawallexpression x,e; 1902da7b42SJulia Lawallposition p; 20e8fa600eSJulia Lawall@@ 21e8fa600eSJulia Lawall 2202da7b42SJulia Lawallif (IS_ERR(x=e) || ...) { 2302da7b42SJulia Lawall <... 2402da7b42SJulia Lawall PTR_ERR@p(x) 2502da7b42SJulia Lawall ...> 2602da7b42SJulia Lawall} 2702da7b42SJulia Lawall 2802da7b42SJulia Lawall@ok2 exists@ 2902da7b42SJulia Lawallexpression x,e1,e2; 3002da7b42SJulia Lawallposition p; 3102da7b42SJulia Lawall@@ 3202da7b42SJulia Lawall 3302da7b42SJulia Lawallif (IS_ERR(x) || ...) { 3402da7b42SJulia Lawall <... 35e8fa600eSJulia Lawall( 3602da7b42SJulia Lawall PTR_ERR@p(\(e1 ? e2 : x\|e1 ? x : e2\)) 37e8fa600eSJulia Lawall| 3802da7b42SJulia Lawall PTR_ERR@p(x) 39e8fa600eSJulia Lawall) 4002da7b42SJulia Lawall ...> 4102da7b42SJulia Lawall} 42e8fa600eSJulia Lawall 4302da7b42SJulia Lawall@r1 depends on patch && !context && !org && !report exists@ 4402da7b42SJulia Lawallexpression x,y; 4502da7b42SJulia Lawallposition p != {ok1.p,ok2.p}; 46e8fa600eSJulia Lawall@@ 47e8fa600eSJulia Lawall 4802da7b42SJulia Lawallif (IS_ERR(x) || ...) { 4902da7b42SJulia Lawall ... when any 5002da7b42SJulia Lawall when != IS_ERR(...) 51e8fa600eSJulia Lawall( 5202da7b42SJulia Lawall PTR_ERR(x) 53e8fa600eSJulia Lawall| 5402da7b42SJulia Lawall PTR_ERR@p( 5502da7b42SJulia Lawall- y 5602da7b42SJulia Lawall+ x 57e8fa600eSJulia Lawall ) 5802da7b42SJulia Lawall) 5902da7b42SJulia Lawall ... when any 6002da7b42SJulia Lawall} 61e8fa600eSJulia Lawall 6202da7b42SJulia Lawall// ---------------------------------------------------------------------------- 6302da7b42SJulia Lawall 6402da7b42SJulia Lawall@r1_context depends on !patch && (context || org || report) exists@ 6502da7b42SJulia Lawallposition p != {ok1.p,ok2.p}; 6602da7b42SJulia Lawallexpression x, y; 6702da7b42SJulia Lawallposition j0, j1; 68e8fa600eSJulia Lawall@@ 69e8fa600eSJulia Lawall 7002da7b42SJulia Lawallif (IS_ERR@j0(x) || ...) { 7102da7b42SJulia Lawall ... when any 7202da7b42SJulia Lawall when != IS_ERR(...) 7302da7b42SJulia Lawall( 7402da7b42SJulia Lawall PTR_ERR(x) 7502da7b42SJulia Lawall| 7602da7b42SJulia Lawall PTR_ERR@j1@p( 7702da7b42SJulia Lawall y 7802da7b42SJulia Lawall ) 7902da7b42SJulia Lawall) 8002da7b42SJulia Lawall ... when any 8102da7b42SJulia Lawall} 82e8fa600eSJulia Lawall 8302da7b42SJulia Lawall@r1_disj depends on !patch && (context || org || report) exists@ 8402da7b42SJulia Lawallposition p != {ok1.p,ok2.p}; 8502da7b42SJulia Lawallexpression x, y; 8602da7b42SJulia Lawallposition r1_context.j0, r1_context.j1; 87e8fa600eSJulia Lawall@@ 88e8fa600eSJulia Lawall 8902da7b42SJulia Lawall* if (IS_ERR@j0(x) || ...) { 9002da7b42SJulia Lawall ... when any 9102da7b42SJulia Lawall when != IS_ERR(...) 9202da7b42SJulia Lawall* PTR_ERR@j1@p( 9302da7b42SJulia Lawall y 9402da7b42SJulia Lawall ) 9502da7b42SJulia Lawall ... when any 9602da7b42SJulia Lawall} 9702da7b42SJulia Lawall 9802da7b42SJulia Lawall// ---------------------------------------------------------------------------- 9902da7b42SJulia Lawall 10002da7b42SJulia Lawall@script:python r1_org depends on org@ 10102da7b42SJulia Lawallj0 << r1_context.j0; 10202da7b42SJulia Lawallj1 << r1_context.j1; 10302da7b42SJulia Lawall@@ 10402da7b42SJulia Lawall 10502da7b42SJulia Lawallmsg = "inconsistent IS_ERR and PTR_ERR" 10602da7b42SJulia Lawallcoccilib.org.print_todo(j0[0], msg) 10702da7b42SJulia Lawallcoccilib.org.print_link(j1[0], "") 10802da7b42SJulia Lawall 10902da7b42SJulia Lawall// ---------------------------------------------------------------------------- 11002da7b42SJulia Lawall 11102da7b42SJulia Lawall@script:python r1_report depends on report@ 11202da7b42SJulia Lawallj0 << r1_context.j0; 11302da7b42SJulia Lawallj1 << r1_context.j1; 11402da7b42SJulia Lawall@@ 11502da7b42SJulia Lawall 11602da7b42SJulia Lawallmsg = "inconsistent IS_ERR and PTR_ERR on line %s." % (j1[0].line) 11702da7b42SJulia Lawallcoccilib.report.print_report(j0[0], msg) 11802da7b42SJulia Lawall 119