From: Julia Lawall <julia@diku.dk> To: Chris Mason <chris.mason@oracle.com>, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org Subject: [PATCH 3/5] fs/btrfs: Eliminate memory leak Date: Tue, 24 Aug 2010 16:39:12 +0200 (CEST) [thread overview] Message-ID: <Pine.LNX.4.64.1008241638560.15172@ask.diku.dk> (raw) From: Julia Lawall <julia@diku.dk> This code is preceded by a call to btrfs_alloc_path, which allocates some memory. There is some error handling code at the end of the function that frees it, that can be taken advantage of with a little ordering adjustment. A simplified version of the semantic match that finds this problem is: (http://coccinelle.lip6.fr/) // <smpl> @r exists@ local idexpression x; expression E; identifier f1; iterator I; @@ x = btrfs_alloc_path(...); <... when != x when != true (x == NULL || ...) when != if (...) { <+...x...+> } when != I (...) { <+...x...+> } ( x == NULL | x == E | x->f1 ) ...> * return ...; // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> --- fs/btrfs/inode.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c038644..d38587c 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4438,15 +4438,14 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, BUG_ON(!path); inode = new_inode(root->fs_info->sb); - if (!inode) - return ERR_PTR(-ENOMEM); - + if (!inode) { + ret = -ENOMEM; + goto fail_path; + } if (dir) { ret = btrfs_set_inode_index(dir, index); - if (ret) { - iput(inode); - return ERR_PTR(ret); - } + if (ret) + goto fail_inode; } /* * index_cnt is ignored for everything but a dir, @@ -4519,8 +4518,10 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, fail: if (dir) BTRFS_I(dir)->index_cnt--; - btrfs_free_path(path); +fail_inode: iput(inode); +fail_path: + btrfs_free_path(path); return ERR_PTR(ret); }
WARNING: multiple messages have this Message-ID (diff)
From: Julia Lawall <julia@diku.dk> To: Chris Mason <chris.mason@oracle.com>, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-janitors@vger.kernel.org Subject: [PATCH 3/5] fs/btrfs: Eliminate memory leak Date: Tue, 24 Aug 2010 14:39:12 +0000 [thread overview] Message-ID: <Pine.LNX.4.64.1008241638560.15172@ask.diku.dk> (raw) From: Julia Lawall <julia@diku.dk> This code is preceded by a call to btrfs_alloc_path, which allocates some memory. There is some error handling code at the end of the function that frees it, that can be taken advantage of with a little ordering adjustment. A simplified version of the semantic match that finds this problem is: (http://coccinelle.lip6.fr/) // <smpl> @r exists@ local idexpression x; expression E; identifier f1; iterator I; @@ x = btrfs_alloc_path(...); <... when != x when != true (x = NULL || ...) when != if (...) { <+...x...+> } when != I (...) { <+...x...+> } ( x = NULL | x = E | x->f1 ) ...> * return ...; // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> --- fs/btrfs/inode.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c038644..d38587c 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4438,15 +4438,14 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, BUG_ON(!path); inode = new_inode(root->fs_info->sb); - if (!inode) - return ERR_PTR(-ENOMEM); - + if (!inode) { + ret = -ENOMEM; + goto fail_path; + } if (dir) { ret = btrfs_set_inode_index(dir, index); - if (ret) { - iput(inode); - return ERR_PTR(ret); - } + if (ret) + goto fail_inode; } /* * index_cnt is ignored for everything but a dir, @@ -4519,8 +4518,10 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, fail: if (dir) BTRFS_I(dir)->index_cnt--; - btrfs_free_path(path); +fail_inode: iput(inode); +fail_path: + btrfs_free_path(path); return ERR_PTR(ret); }
next reply other threads:[~2010-08-24 14:39 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-08-24 14:39 Julia Lawall [this message] 2010-08-24 14:39 ` [PATCH 3/5] fs/btrfs: Eliminate memory leak Julia Lawall [not found] <1282776100-21671-1-git-send-email-julia@diku.dk> [not found] ` <1282776100-21671-4-git-send-email-julia@diku.dk> 2010-08-25 21:57 ` Julia Lawall
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=Pine.LNX.4.64.1008241638560.15172@ask.diku.dk \ --to=julia@diku.dk \ --cc=chris.mason@oracle.com \ --cc=kernel-janitors@vger.kernel.org \ --cc=linux-btrfs@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.