bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 11/13] trans: improve the error handling in fakeauth


From: Justus Winter
Subject: [PATCH 11/13] trans: improve the error handling in fakeauth
Date: Mon, 9 Dec 2013 15:16:39 +0100

Previously the node was not correctly torn down if adding the newly
created netnode to the hash table failed.  Fix this by rearranging the
code, doing the hash table modification first because it is easier to
undo.

* trans/fakeroot.c (new_node): Fix the error handling.
---
 trans/fakeroot.c |   37 ++++++++++++++++++++-----------------
 1 file changed, 20 insertions(+), 17 deletions(-)

diff --git a/trans/fakeroot.c b/trans/fakeroot.c
index 5c4854d..3756f48 100644
--- a/trans/fakeroot.c
+++ b/trans/fakeroot.c
@@ -95,28 +95,31 @@ new_node (file_t file, mach_port_t idport, int locked, int 
openmodes,
          return err;
        }
     }
+
+  if (!locked)
+    pthread_mutex_lock (&idport_ihash_lock);
+  err = hurd_ihash_add (&idport_ihash, nn->idport, nn);
+  if (err)
+    goto lose;
+
   *np = nn->np = netfs_make_node (nn);
   if (*np == 0)
     {
-      if (locked)
-       pthread_mutex_unlock (&idport_ihash_lock);
       err = ENOMEM;
+      goto lose_hash;
     }
-  else
-    {
-      if (!locked)
-       pthread_mutex_lock (&idport_ihash_lock);
-      err = hurd_ihash_add (&idport_ihash, nn->idport, nn);
-      if (!err)
-       pthread_mutex_lock (&(*np)->lock);
-      pthread_mutex_unlock (&idport_ihash_lock);
-    }
-  if (err)
-    {
-      mach_port_deallocate (mach_task_self (), nn->idport);
-      mach_port_deallocate (mach_task_self (), file);
-      free (nn);
-    }
+
+  pthread_mutex_lock (&(*np)->lock);
+  pthread_mutex_unlock (&idport_ihash_lock);
+  return 0;
+
+ lose_hash:
+  hurd_ihash_locp_remove (&idport_ihash, nn->idport_locp);
+ lose:
+  pthread_mutex_unlock (&idport_ihash_lock);
+  mach_port_deallocate (mach_task_self (), nn->idport);
+  mach_port_deallocate (mach_task_self (), file);
+  free (nn);
   return err;
 }
 
-- 
1.7.10.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]