Justus Winter, le Mon 09 Dec 2013 15:16:39 +0100, a écrit :
> 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.
Ack
> * 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
>
--
Samuel
Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"