From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Brian Norris <computersforpeace@gmail.com>
Cc: <linux-mtd@lists.infradead.org>,
Richard Weinberger <richard@nod.at>,
Marek Vasut <marek.vasut@gmail.com>,
Cyrille Pitchen <cyrille.pitchen@wedev4u.fr>
Subject: Re: [PATCH] mtd: nand: free vendor-specific resources in init failure paths
Date: Tue, 2 May 2017 09:52:30 +0200 [thread overview]
Message-ID: <20170502095230.2cd20b1c@bbrezillon> (raw)
In-Reply-To: <20170502000455.13240-4-computersforpeace@gmail.com>
On Mon, 1 May 2017 17:04:53 -0700
Brian Norris <computersforpeace@gmail.com> wrote:
> If we fail any time after calling nand_detect(), then we don't call the
> vendor-specific ->cleanup() callback, and we'll leak any resources the
> vendor-specific code might have allocated.
>
> Mark the "fix" against the first commit that started allocating anything
> in ->init().
Yep, I noticed this leak while reviewing/applying Masahiro's series
[1], and forgot to send a fix for this bug.
Actually, I'm not sure we should keep nand_manufacturer_init() in
nand_scan_ident(), especially if we consider that nand_scan_ident() is
not supposed to allocate resources and does not require a
nand_cleanup() when something fails between nand_scan_ident() and
nand_scan_tail().
Note that nand_scan_ident() is already allocating resources through
nand_init_data_interface() which are also leaked if nand_cleanup() is
not called. Again, we could solve the problem by moving data-iface
initialization steps in nand_scan_tail() (which shouldn't be a problem
AFAICS). Alternatively, we could could consider that nand_cleanup() is
smart enough to know what to not release (which seems to be the case
already), and force drivers to call nand_cleanup() as soon as
nand_scan_ident() has returned 0.
Brian, any opinion?
Anyway, this is a bit off-topic, so for this patch
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
>
> Cc: Boris Brezillon <boris.brezillon@free-electrons.com>
> Fixes: 626994e07480 ("mtd: nand: hynix: Add read-retry support for 1x nm MLC NANDs")
> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
> ---
> Compile tested only
>
> drivers/mtd/nand/nand_base.c | 38 +++++++++++++++++++++++++++++---------
> 1 file changed, 29 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index 2adcc8cdedf1..978242b1213f 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -4300,7 +4300,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
> /* Initialize the ->data_interface field. */
> ret = nand_init_data_interface(chip);
> if (ret)
> - return ret;
> + goto err_nand_init;
>
> /*
> * Setup the data interface correctly on the chip and controller side.
> @@ -4312,7 +4312,7 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
> */
> ret = nand_setup_data_interface(chip);
> if (ret)
> - return ret;
> + goto err_nand_init;
>
> nand_maf_id = chip->id.data[0];
> nand_dev_id = chip->id.data[1];
> @@ -4343,6 +4343,12 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
> mtd->size = i * chip->chipsize;
>
> return 0;
> +
> +err_nand_init:
> + /* Free manufacturer priv data. */
> + nand_manufacturer_cleanup(chip);
> +
> + return ret;
> }
> EXPORT_SYMBOL(nand_scan_ident);
>
> @@ -4513,18 +4519,23 @@ int nand_scan_tail(struct mtd_info *mtd)
>
> /* New bad blocks should be marked in OOB, flash-based BBT, or both */
> if (WARN_ON((chip->bbt_options & NAND_BBT_NO_OOB_BBM) &&
> - !(chip->bbt_options & NAND_BBT_USE_FLASH)))
> - return -EINVAL;
> + !(chip->bbt_options & NAND_BBT_USE_FLASH))) {
> + ret = -EINVAL;
> + goto err_ident;
> + }
>
> if (invalid_ecc_page_accessors(chip)) {
> pr_err("Invalid ECC page accessors setup\n");
> - return -EINVAL;
> + ret = -EINVAL;
> + goto err_ident;
> }
>
> if (!(chip->options & NAND_OWN_BUFFERS)) {
> nbuf = kzalloc(sizeof(*nbuf), GFP_KERNEL);
> - if (!nbuf)
> - return -ENOMEM;
> + if (!nbuf) {
> + ret = -ENOMEM;
> + goto err_ident;
> + }
>
> nbuf->ecccalc = kmalloc(mtd->oobsize, GFP_KERNEL);
> if (!nbuf->ecccalc) {
> @@ -4547,8 +4558,10 @@ int nand_scan_tail(struct mtd_info *mtd)
>
> chip->buffers = nbuf;
> } else {
> - if (!chip->buffers)
> - return -ENOMEM;
> + if (!chip->buffers) {
> + ret = -ENOMEM;
> + goto err_ident;
> + }
> }
>
> /* Set the internal oob buffer location, just after the page data */
> @@ -4789,6 +4802,13 @@ int nand_scan_tail(struct mtd_info *mtd)
> kfree(nbuf->ecccalc);
> kfree(nbuf);
> }
> +
> +err_ident:
> + /* Clean up nand_scan_ident(). */
> +
> + /* Free manufacturer priv data. */
> + nand_manufacturer_cleanup(chip);
> +
> return ret;
> }
> EXPORT_SYMBOL(nand_scan_tail);
next prev parent reply other threads:[~2017-05-02 7:53 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-02 0:04 [PATCH] mtd: nand: don't leak buffers when ->scan_bbt() fails Brian Norris
2017-05-02 0:04 ` [PATCH] mtd: nand: don't make vendor-specific code un-set their data pointer Brian Norris
2017-05-02 7:15 ` Boris Brezillon
2017-05-02 0:04 ` [PATCH] mtd: nand: drop unneeded module.h include Brian Norris
2017-05-02 7:16 ` Boris Brezillon
2017-05-15 20:50 ` Boris Brezillon
2017-05-02 0:04 ` [PATCH] mtd: nand: free vendor-specific resources in init failure paths Brian Norris
2017-05-02 7:52 ` Boris Brezillon [this message]
2017-05-02 16:15 ` Boris Brezillon
2017-05-15 20:49 ` Boris Brezillon
2017-05-02 0:04 ` [PATCH] mtd: nand: orion: don't complain for probe deferral Brian Norris
2017-05-02 7:56 ` Boris Brezillon
2017-05-02 8:07 ` Simon Baatz
2017-05-08 17:46 ` Brian Norris
2017-05-02 0:04 ` [PATCH] mtd: nand: samsung: warn about un-parseable ECC info Brian Norris
2017-05-02 7:57 ` Boris Brezillon
2017-05-15 20:48 ` Boris Brezillon
2017-05-02 0:22 ` [PATCH] mtd: nand: don't leak buffers when ->scan_bbt() fails Ezequiel Garcia
2017-05-02 1:33 ` Brian Norris
2017-05-02 2:21 ` Ezequiel Garcia
2017-05-02 7:17 ` Boris Brezillon
2017-05-15 20:50 ` Boris Brezillon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170502095230.2cd20b1c@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=computersforpeace@gmail.com \
--cc=cyrille.pitchen@wedev4u.fr \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=richard@nod.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox