Milos Nikic, le jeu. 29 oct. 2026 21:26:40 -0700, a ecrit:
> diskfs_startup_diskfs unlocks the root node after looking up the
> virtual root in it, then lets go of it with diskfs_nput, which unlocks
> it a second time.  Release only its reference.
> 
> With --virtual-root=., the lookup of "." gives back the root node
> itself, already unlocked with the root: do not unlock it again either.
> 
> A default mutex does not check its owner, so the second unlock goes
> unnoticed unless another thread holds the lock by then, which loses it.
> With error-checking mutexes, an ext2fs started with --virtual-root=.
> dies at that unlock.
> ---
>  libdiskfs/init-startup.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/libdiskfs/init-startup.c b/libdiskfs/init-startup.c
> index d51cc2787..736cdb502 100644
> --- a/libdiskfs/init-startup.c
> +++ b/libdiskfs/init-startup.c
> @@ -120,8 +120,10 @@ diskfs_startup_diskfs (mach_port_t fs_bootstrap, int 
> flags)
>        if _diskfs_chroot_directory is non-null.  */
>        old = diskfs_root_node;
>        diskfs_root_node = np;
> -      pthread_mutex_unlock (&np->lock);
> -      diskfs_nput (old);
> +      /* A virtual root that is the root itself was unlocked with it.  */
> +      if (np != old)
> +     pthread_mutex_unlock (&np->lock);
> +      diskfs_nrele (old);

Mmm, but then we don't unlock old?

Samuel

Reply via email to