From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Josef 'Jeff' Sipek" Subject: [PATCH 10/13] fs/unionfs/: Fix copyup_deleted_file dentry leak Date: Sun, 4 Mar 2007 21:16:54 -0500 Message-ID: <11730610183170-git-send-email-jsipek@cs.sunysb.edu> References: <11730610174005-git-send-email-jsipek@cs.sunysb.edu> Cc: Erez Zadok , "Josef 'Jeff' Sipek" To: linux-fsdevel@vger.kernel.org Return-path: Received: from filer.fsl.cs.sunysb.edu ([130.245.126.2]:39140 "EHLO filer.fsl.cs.sunysb.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751880AbXCECRG (ORCPT ); Sun, 4 Mar 2007 21:17:06 -0500 In-Reply-To: <11730610174005-git-send-email-jsipek@cs.sunysb.edu> Sender: linux-fsdevel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org From: Erez Zadok Signed-off-by: Erez Zadok Signed-off-by: Josef 'Jeff' Sipek --- fs/unionfs/commonfops.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/fs/unionfs/commonfops.c b/fs/unionfs/commonfops.c index 2664be9..aa7c75d 100644 --- a/fs/unionfs/commonfops.c +++ b/fs/unionfs/commonfops.c @@ -41,6 +41,15 @@ static int copyup_deleted_file(struct file *file, struct dentry *dentry, sprintf(name, ".unionfs%*.*lx", i_inosize, i_inosize, hidden_dentry->d_inode->i_ino); + /* + * Loop, looking for an unused temp name to copyup to. + * + * It's somewhat silly that we look for a free temp tmp name in the + * source branch (bstart) instead of the dest branch (bindex), where + * the final name will be created. We _will_ catch it if somehow + * the name exists in the dest branch, but it'd be nice to catch it + * sooner than later. + */ tmp_dentry = NULL; do { char *suffix = name + nlen - countersize; @@ -58,7 +67,9 @@ static int copyup_deleted_file(struct file *file, struct dentry *dentry, err = PTR_ERR(tmp_dentry); goto out; } + /* don't dput here because of do-while condition eval order */ } while (tmp_dentry->d_inode != NULL); /* need negative dentry */ + dput(tmp_dentry); err = copyup_named_file(dentry->d_parent->d_inode, file, name, bstart, bindex, file->f_dentry->d_inode->i_size); -- 1.5.0.2.260.g2eb065