From bcef90ac5ab304233df23e4ee924cc294d2864c9 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 26 Aug 2008 23:21:40 +0000 Subject: 2008-08-21 Samuel Thibault * dir-lookup.c (diskfs_S_dir_lookup): Initialize NEWPI and NEWPO to 0, set back to 0 when they do not need to be referenced any more, dereference them if needed just before exit, after all unlocking. --- libdiskfs/dir-lookup.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'libdiskfs/dir-lookup.c') diff --git a/libdiskfs/dir-lookup.c b/libdiskfs/dir-lookup.c index 15af20e2..7e092908 100644 --- a/libdiskfs/dir-lookup.c +++ b/libdiskfs/dir-lookup.c @@ -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; } -- cgit v1.2.3