diff options
author | Samuel Thibault <sthibault@debian.org> | 2008-08-26 23:22:55 +0000 |
---|---|---|
committer | Samuel Thibault <sthibault@debian.org> | 2008-08-26 23:22:55 +0000 |
commit | 43d5bc2127137ef68aa9d641296c702400fc23e2 (patch) | |
tree | 4140f122179ee6f89ef964b3a9805839a4638d46 /debian/patches | |
parent | ed9adb9c14d880734897ef2ccb81f931d71c2753 (diff) |
* debian/patches/diskfs_lookup_error_fix.patch: New patch to fix deadlock in
lookup error conditions.
Diffstat (limited to 'debian/patches')
-rw-r--r-- | debian/patches/diskfs_lookup_error_fix.patch | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/debian/patches/diskfs_lookup_error_fix.patch b/debian/patches/diskfs_lookup_error_fix.patch new file mode 100644 index 00000000..a9cae297 --- /dev/null +++ b/debian/patches/diskfs_lookup_error_fix.patch @@ -0,0 +1,86 @@ +2008-08-21 Samuel Thibault <samuel.thibault@ens-lyon.org> + + * 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. + +Index: libdiskfs/dir-lookup.c +=================================================================== +RCS file: /cvsroot/hurd/hurd/libdiskfs/dir-lookup.c,v +retrieving revision 1.56 +diff -u -p -r1.56 dir-lookup.c +--- libdiskfs/dir-lookup.c 20 Aug 2008 22:59:52 -0000 1.56 ++++ libdiskfs/dir-lookup.c 26 Aug 2008 23:18:44 -0000 +@@ -53,8 +53,8 @@ diskfs_S_dir_lookup (struct protid *dirc + 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 *dirc + 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 *dirc + + 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 *dirc + 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 *dirc + if (dnp) + diskfs_nput (dnp); + ++ if (newpi) ++ ports_port_deref (newpi); ++ if (newpo) ++ diskfs_release_peropen (newpo); ++ + return error; + } |