Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp836427imj; Fri, 15 Feb 2019 07:36:44 -0800 (PST) X-Google-Smtp-Source: AHgI3IYuYxgMP/Xc1xRDQbSrSJg4dTwJtcqdGKViom6jFiSgVers1ACMSu66bVjktAI1R3v84UUf X-Received: by 2002:a63:4703:: with SMTP id u3mr5875053pga.298.1550245003963; Fri, 15 Feb 2019 07:36:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550245003; cv=none; d=google.com; s=arc-20160816; b=azxhzNjMk8M7jb6EoEFLutKKIcgqnb0/bG4Etrc5Y4sRe+quhnltI8r3bJpTPBnf6X Mh9FnBDneY33zvjNKftZInlcpl1nd9qD/k0MqtMcAiNLtO0DTrSd2SNpPeBdxhi1sj5j 3MyAY1thpJHdF8qQggR3uU28QKoUVq4qnc2ri2wsvNlZtLDxMHuoChpdoGB7rZZgWpas 4SIwGiyFzAw2rVcUGj5hFvlLWb8CxVjk/AKzNxyKvo2uhZrS3wJ30G5eGMG9F7OIjYyg 9OQqLMtQqnRQC79mIdEdK2YSrbQTg427XzyctpHssPoTzkhWejgmTu8xH9UuW2lQmaAu AG3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=AiXMj5WsTJVVHw1yQf3m5XtLcqYutwhWoo3ezEFGNEg=; b=Prlj64GB4QK1+Mcg2GuRfqMS+scmr3JCw0UyXJ+kJdrY7ZL0NnUhPsOfHpIwwUGGMF rCVFvB30TVF70g4Wr+KwUm603Kr4ftTeDDxeKY8LCHYxyqcxCoueq0CgxHrx4VcCDiZ1 fUlEE27rs6zkr90V7wZUjSGhlgknHJZ15tmGo0qWf0jX6MUf/4Mp/a3x78pYRgS0ZNzF iYMaugd5LyA0HyC12FC+UlF+J6yL/fJXCKUHSxvO9tzTa7z/IM6kdaaLYcYwxVSv+C5g zReACeVYG1UlVoV8Kosb+3hdYF/Qz96kN9auX2wS38lYURaivFHetH2a9/aT7Q3IW/Z4 YyBg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e28si285542pgm.368.2019.02.15.07.36.28; Fri, 15 Feb 2019 07:36:43 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390768AbfBOHyw convert rfc822-to-8bit (ORCPT + 99 others); Fri, 15 Feb 2019 02:54:52 -0500 Received: from out1.zte.com.cn ([202.103.147.172]:47990 "EHLO mxct.zte.com.cn" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730957AbfBOHyw (ORCPT ); Fri, 15 Feb 2019 02:54:52 -0500 Received: from mse01.zte.com.cn (unknown [10.30.3.20]) by Forcepoint Email with ESMTPS id 698BA5A326B8D112375F; Fri, 15 Feb 2019 15:54:44 +0800 (CST) Received: from notes_smtp.zte.com.cn ([10.30.1.239]) by mse01.zte.com.cn with ESMTP id x1F7sZnv062434; Fri, 15 Feb 2019 15:54:35 +0800 (GMT-8) (envelope-from wen.yang99@zte.com.cn) Received: from fox-host8.localdomain ([10.74.120.8]) by szsmtp06.zte.com.cn (Lotus Domino Release 8.5.3FP6) with ESMTP id 2019021515543874-67583 ; Fri, 15 Feb 2019 15:54:38 +0800 From: Wen Yang To: Julia.Lawall@lip6.fr Cc: Gilles.Muller@lip6.fr, nicolas.palix@imag.fr, michal.lkml@markovi.net, Markus.Elfring@web.de, wang.yi59@zte.com.cn, Wen Yang , Masahiro Yamada , Wen Yang , cheng.shengyu@zte.com.cn, cocci@systeme.lip6.fr, linux-kernel@vger.kernel.org Subject: [PATCH v5] coccinelle: semantic code search for missing put_device() Date: Fri, 15 Feb 2019 15:55:19 +0800 Message-Id: <1550217319-40418-1-git-send-email-wen.yang99@zte.com.cn> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 X-MIMETrack: Itemize by SMTP Server on SZSMTP06/server/zte_ltd(Release 8.5.3FP6|November 21, 2013) at 2019-02-15 15:54:38, Serialize by Router on notes_smtp/zte_ltd(Release 9.0.1FP7|August 17, 2016) at 2019-02-15 15:54:20 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT X-MAIL: mse01.zte.com.cn x1F7sZnv062434 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The of_find_device_by_node() takes a reference to the underlying device structure, we should release that reference. The implementation of this semantic code search is: In a function, for a local variable returned by calling of_find_device_by_node(), a, if it is released by a function such as put_device()/of_dev_put()/platform_device_put() after the last use, it is considered that there is no reference leak; b, if it is passed back to the caller via dev_get_drvdata()/platform_get_drvdata()/get_device(), etc., the reference will be released in other functions, and the current function also considers that there is no reference leak; c, for the rest of the situation, the current function should release the reference by calling put_device, this code search will report the corresponding error message. By using this semantic code search, we have found some object reference leaks, such as: commit 11907e9d3533 ("ASoC: fsl-asoc-card: fix object reference leaks in fsl_asoc_card_probe") commit a12085d13997 ("mtd: rawnand: atmel: fix possible object reference leak") commit 11493f26856a ("mtd: rawnand: jz4780: fix possible object reference leak") There are still dozens of reference leaks in the current kernel code. Further, for the case of b, the object returned to other functions may also have a reference leak, we will continue to develop other cocci scripts to further check the reference leak. Signed-off-by: Wen Yang Reviewed-by: Julia Lawall Reviewed-by: Markus Elfring Cc: Julia Lawall Cc: Gilles Muller Cc: Nicolas Palix Cc: Michal Marek Cc: Markus Elfring Cc: Masahiro Yamada Cc: Wen Yang Cc: cheng.shengyu@zte.com.cn Cc: cocci@systeme.lip6.fr Cc: linux-kernel@vger.kernel.org --- v5->v4: - exchange the word “patch” by “code search” - add a SPDX identifierfix - a split string literal can be unwanted. - Change the content of the reported information. v4->v3: - add Masahiro Yamada - omit a blank line - split the long message parameter - reduce the number of metavariables - Describe the implementation of the semantic patch, explain the scenarios it can detect, and further software development considerations. v3->v2: - reduction of a bit of redundant C code within SmPL search specifications. - consider the message construction without using the extra Python variable “msg” v2->v1: - put exists after search, and then drop the when exists below. - should not use the same e as in the when's below. - Make a new type metavariable and use it to put a cast on the result of platform_get_drvdata. scripts/coccinelle/free/put_device.cocci | 56 ++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 scripts/coccinelle/free/put_device.cocci diff --git a/scripts/coccinelle/free/put_device.cocci b/scripts/coccinelle/free/put_device.cocci new file mode 100644 index 0000000..7395697 --- /dev/null +++ b/scripts/coccinelle/free/put_device.cocci @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +/// Find missing put_device for every of_find_device_by_node. +/// +// Confidence: Moderate +// Copyright: (C) 2018-2019 Wen Yang, ZTE. +// Comments: +// Options: --no-includes --include-headers + +virtual report +virtual org + +@search exists@ +local idexpression id; +expression x,e,e1; +position p1,p2; +type T,T1,T2,T3; +@@ + +id = of_find_device_by_node@p1(x) +... when != e = id +if (id == NULL || ...) { ... return ...; } +... when != put_device(&id->dev) + when != platform_device_put(id) + when != of_dev_put(id) + when != if (id) { ... put_device(&id->dev) ... } + when != e1 = (T)id + when != e1 = &id->dev + when != e1 = get_device(&id->dev) + when != e1 = (T1)platform_get_drvdata(id) +( + return +( id +| (T2)dev_get_drvdata(&id->dev) +| (T3)platform_get_drvdata(id) +); +| return@p2 ...; +) + +@script:python depends on report@ +p1 << search.p1; +p2 << search.p2; +@@ + +coccilib.report.print_report(p2[0], "ERROR: missing put_device; " + + "call of_find_device_by_node on line " + + p1[0].line + + ", but without a corresponding object release " + + "within this function.") + +@script:python depends on org@ +p1 << search.p1; +p2 << search.p2; +@@ + +cocci.print_main("of_find_device_by_node", p1) +cocci.print_secs("needed put_device", p2) -- 2.9.5