Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp4826386imj; Wed, 13 Feb 2019 01:36:19 -0800 (PST) X-Google-Smtp-Source: AHgI3Ibm09Zj9DYpchbt7/VZyEINORDih9m7uKsfbSQIfuqx+GVqSB/fJo+uVPa+um7SZEFEM8Uq X-Received: by 2002:aa7:8a17:: with SMTP id m23mr8751794pfa.258.1550050579596; Wed, 13 Feb 2019 01:36:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550050579; cv=none; d=google.com; s=arc-20160816; b=ggR6TMoxCzR4lRCSPL14GRFGNpCOaAjQDwsqd6xT6herWoGyn4FMBIeu+91QwOc2Gs CR4bKa3tUBpISQYQrJQk3mvoeIIdwaFvJidmBZMfmUiQy/mAtHaPymHCi4JISGJCqvah ItVce/PdYaRqKlJRNlhsBpoZ678xBp+6F72n/YSLaFSDlA8uTS2oV5ItE4NUxn2A//yQ XN9oLmvuhS3XZ56buemZRAy169/Ak07lIn/wgOBQeO85vE2SLEmzC2TngtNzKqqbiHZC S+aFgvF6muBAHXbTopsZ8Toz2ArCo25UYMC01v6cJpWag3pcjQHoDs/SjffCkRz0hykd TL4g== 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=HpB1HHd9ACcd0uERufq2NEVBAEIvfNi5jsajCv9r1gU=; b=cqUvKpIjDrxpxEkW2DJRn277j+a3+yEYf8L2hOdbV6mEByHIIbcQUvcpCQ/l4PJszi jFqJwhx9vBZE9EHIw9PdOSUFJQYpkSImKW4SprQ1aEhn4eox9TBQ0lKu72R2rj49OoPX nlIFhyV73mczQyDN6EmmUBZuh8LRexNxTeEZZgA5FIrJi+boahw2ORm1uObf9qbmJQd+ ruInzID2xDRDL8tymXPQTJO9hJ+JFG5KcuCsQtkoL5HhwJ5JjaE5usZhNXuOdtQPs66i WTFzJQkJXAmEjEN4Q/zpMU+sC9UxxBX7D3plRLN0AtUpm/BVgO0j611ektaHAZgE/OYZ dV/Q== 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 go11si15270019plb.373.2019.02.13.01.36.04; Wed, 13 Feb 2019 01:36:19 -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 S1732802AbfBMG0c convert rfc822-to-8bit (ORCPT + 99 others); Wed, 13 Feb 2019 01:26:32 -0500 Received: from out1.zte.com.cn ([202.103.147.172]:44628 "EHLO mxct.zte.com.cn" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727172AbfBMG0c (ORCPT ); Wed, 13 Feb 2019 01:26:32 -0500 Received: from mse01.zte.com.cn (unknown [10.30.3.20]) by Forcepoint Email with ESMTPS id 5AFA218EDD295D664393; Wed, 13 Feb 2019 14:26:27 +0800 (CST) Received: from notes_smtp.zte.com.cn ([10.30.1.239]) by mse01.zte.com.cn with ESMTP id x1D6QHhk032494; Wed, 13 Feb 2019 14:26:17 +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 2019021314263880-25842064 ; Wed, 13 Feb 2019 14:26: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, xue.zhihong@zte.com.cn, wang.yi59@zte.com.cn, Wen Yang , Wen Yang , cocci@systeme.lip6.fr, linux-kernel@vger.kernel.org Subject: [PATCH v3] coccinelle: semantic patch for missing put_device() Date: Wed, 13 Feb 2019 14:23:35 +0800 Message-Id: <1550039015-5587-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-13 14:26:39, Serialize by Router on notes_smtp/zte_ltd(Release 9.0.1FP7|August 17, 2016) at 2019-02-13 14:26:09 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT X-MAIL: mse01.zte.com.cn x1D6QHhk032494 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. By using this semantic patch, 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. 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: Wen Yang Cc: cocci@systeme.lip6.fr Cc: linux-kernel@vger.kernel.org --- 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 | 52 ++++++++++++++++++++++++++++++++ 1 file changed, 52 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..9a94b8d --- /dev/null +++ b/scripts/coccinelle/free/put_device.cocci @@ -0,0 +1,52 @@ +/// Find missing put_device for every of_find_device_by_node. +/// +// Confidence: Moderate +// Copyright: (C) 2018-2019 Wen Yang, ZTE. GPLv2. +// Comments: +// Options: --no-includes --include-headers + +virtual report +virtual org + +@search exists@ +local idexpression id; +expression x,e,e1,e2,e3,e4; +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 != e2 = &id->dev + when != e3 = get_device(&id->dev) + when != e4 = (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; of_find_device_by_node on line " + p1[0].line + " and return without releasing.") + +@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