diff options
Diffstat (limited to 'libdiskfs/dir-lookup.c')
-rw-r--r-- | libdiskfs/dir-lookup.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c index 56c9587e..7e092908 100644 --- a/libdiskfs/dir-lookup.c +++ b/libdiskfs/dir-lookup.c @@ -1,6 +1,6 @@ /* libdiskfs implementation of fs.defs:dir_lookup - Copyright (C) 1992,93,94,95,96,97,98,99,2000,01,02 - Free Software Foundation, Inc. + Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, + 2002, 2008 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -53,8 +53,8 @@ diskfs_S_dir_lookup (struct protid *dircred, int mustbedir = 0; size_t amt; int type; - struct protid *newpi; - struct peropen *newpo; + struct protid *newpi = 0; + struct peropen *newpo = 0; if (!dircred) return EOPNOTSUPP; @@ -257,8 +257,8 @@ diskfs_S_dir_lookup (struct protid *dircred, if (! error) { error = diskfs_create_protid (newpo, user, &newpi); - if (error) - diskfs_release_peropen (newpo); + if (! error) + newpo = 0; } iohelp_free_iouser (user); @@ -269,6 +269,7 @@ diskfs_S_dir_lookup (struct protid *dircred, dirport = ports_get_send_right (newpi); ports_port_deref (newpi); + newpi = 0; if (np != dnp) mutex_unlock (&dnp->lock); @@ -460,28 +461,24 @@ diskfs_S_dir_lookup (struct protid *dircred, dircred->po, &newpo); if (! error) - { - error = diskfs_create_protid (newpo, dircred->user, &newpi); - if (error) - diskfs_release_peropen (newpo); - } + error = diskfs_create_protid (newpo, dircred->user, &newpi); if (! error) { + newpo = 0; if (flags & O_EXLOCK) error = fshelp_acquire_lock (&np->userlock, &newpi->po->lock_status, &np->lock, LOCK_EX); else if (flags & O_SHLOCK) error = fshelp_acquire_lock (&np->userlock, &newpi->po->lock_status, &np->lock, LOCK_SH); - if (error) - ports_port_deref (newpi); /* Get rid of NEWPI. */ } if (! error) { *returned_port = ports_get_right (newpi); ports_port_deref (newpi); + newpi = 0; } out: @@ -495,5 +492,10 @@ diskfs_S_dir_lookup (struct protid *dircred, if (dnp) diskfs_nput (dnp); + if (newpi) + ports_port_deref (newpi); + if (newpo) + diskfs_release_peropen (newpo); + return error; } |