lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 2 Mar 2020 15:30:43 +0100
From:   Carlos Maiolino <cmaiolino@...hat.com>
To:     Lukas Czerner <lczerner@...hat.com>
Cc:     linux-ext4@...r.kernel.org, tytso@....edu,
        Zdenek Kabelac <zkabelac@...hat.com>,
        Karel Zak <kzak@...hat.com>
Subject: Re: [PATCH] libext2fs/ismounted.c: check open(O_EXCL) before mntent
 file

On Tue, Feb 25, 2020 at 03:34:45PM +0100, Lukas Czerner wrote:
> Currently the ext2fs_check_mount_point() will use the open(O_EXCL) check
> on linux after all the other checks are done. However it is not
> necessary to check mntent if open(O_EXCL) succeeds because it means that
> the device is not mounted.
> 
> Moreover the commit ea4d53b7 introduced a regression where a following
> set of commands fails:
> 
> vgcreate mygroup /dev/sda
> lvcreate -L 1G -n lvol0 mygroup
> mkfs.ext4 /dev/mygroup/lvol0
> mount /dev/mygroup/lvol0 /mnt
> lvrename /dev/mygroup/lvol0 /dev/mygroup/lvol1
> lvcreate -L 1G -n lvol0 mygroup
> mkfs.ext4 /dev/mygroup/lvol0   <<<--- This fails
> 
> It fails because it thinks that /dev/mygroup/lvol0 is mounted because
> the device name in /proc/mounts is not updated following the lvrename.
> 
> Move the open(O_EXCL) check before the mntent check and return
> immediatelly if the device is not busy.
> 
> Fixes: ea4d53b7 ("libext2fs/ismounted.c: check device id in advance to skip false device names")
> Signed-off-by: Lukas Czerner <lczerner@...hat.com>
> Reported-by: Zdenek Kabelac <zkabelac@...hat.com>
> Reported-by: Karel Zak <kzak@...hat.com>
> ---

...

> +			if (fd >= 0) {
> +				/*
> +				 * The device is not busy so it's
> +				 * definitelly not mounted. No need to
> +				 * to perform any more checks.
> +				 */
> +				close(fd);
> +				*mount_flags = 0;
> +				return 0;
> +			} else if (errno == EBUSY)
> +				busy = 1;

			^ I think you are supposed to use {} for the 'else if'
			  branch too, once the first branch uses it

Other than the small coding style above, which depends on maintainer, the code
looks ok, and you can add:

Reviewed-by: Carlos Maiolino <cmaiolino@...hat.com>

Cheers


> +		}
> +	}
> +#endif
> +
>  	if (is_swap_device(device)) {
>  		*mount_flags = EXT2_MF_MOUNTED | EXT2_MF_SWAP;
>  		strncpy(mtpt, "<swap>", mtlen);
> @@ -386,21 +410,8 @@ errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
>  	if (retval)
>  		return retval;
>  
> -#ifdef __linux__ /* This only works on Linux 2.6+ systems */
> -	{
> -		struct stat st_buf;
> -
> -		if (stat(device, &st_buf) == 0 &&
> -		    ext2fsP_is_disk_device(st_buf.st_mode)) {
> -			int fd = open(device, O_RDONLY | O_EXCL);
> -
> -			if (fd >= 0)
> -				close(fd);
> -			else if (errno == EBUSY)
> -				*mount_flags |= EXT2_MF_BUSY;
> -		}
> -	}
> -#endif
> +	if (busy)
> +		*mount_flags |= EXT2_MF_BUSY;
>  
>  	return 0;
>  }
> -- 
> 2.21.1
> 

-- 
Carlos

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ