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: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 18 May 2017 19:17:07 -0400
From:   Mimi Zohar <zohar@...ux.vnet.ibm.com>
To:     Christoph Hellwig <hch@....de>,
        Andy Shevchenko <andriy.shevchenko@...ux.intel.com>,
        Amir Goldstein <amir73il@...il.com>,
        linux-fsdevel@...r.kernel.org
Cc:     Shaohua Li <shli@...nel.org>,
        Dan Williams <dan.j.williams@...el.com>,
        David Howells <dhowells@...hat.com>,
        Steven Whitehouse <swhiteho@...hat.com>,
        linux-xfs@...r.kernel.org, linux-raid@...r.kernel.org,
        linux-nvdimm@...ts.01.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 17/23] fs: switch ->s_uuid to uuid_t

On Thu, 2017-05-18 at 08:26 +0200, Christoph Hellwig wrote:
> For some file systems we still memcpy into it, but in various places this
> already allows us to use the proper uuid helpers.  More to come..
> 
> Signed-off-by: Christoph Hellwig <hch@....de>

Acked-by: Mimi Zohar <zohar@...ux.vnet.ibm.com> (Changes to IMA/EVM)

> ---
>  drivers/xen/tmem.c                  |  6 +++---
>  fs/ext4/super.c                     |  2 +-
>  fs/f2fs/super.c                     |  2 +-
>  fs/gfs2/ops_fstype.c                |  2 +-
>  fs/gfs2/sys.c                       | 22 +++++-----------------
>  fs/ocfs2/super.c                    |  2 +-
>  fs/overlayfs/copy_up.c              |  5 ++---
>  fs/overlayfs/namei.c                |  2 +-
>  fs/xfs/xfs_mount.c                  |  3 +--
>  include/linux/cleancache.h          |  2 +-
>  include/linux/fs.h                  |  5 +++--
>  mm/cleancache.c                     |  2 +-
>  security/integrity/evm/evm_crypto.c |  2 +-
>  security/integrity/ima/ima_policy.c |  2 +-
>  14 files changed, 23 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c
> index 4ac2ca8a7656..bf13d1ec51f3 100644
> --- a/drivers/xen/tmem.c
> +++ b/drivers/xen/tmem.c
> @@ -233,12 +233,12 @@ static int tmem_cleancache_init_fs(size_t pagesize)
>  	return xen_tmem_new_pool(uuid_private, 0, pagesize);
>  }
> 
> -static int tmem_cleancache_init_shared_fs(char *uuid, size_t pagesize)
> +static int tmem_cleancache_init_shared_fs(uuid_t *uuid, size_t pagesize)
>  {
>  	struct tmem_pool_uuid shared_uuid;
> 
> -	shared_uuid.uuid_lo = *(u64 *)uuid;
> -	shared_uuid.uuid_hi = *(u64 *)(&uuid[8]);
> +	shared_uuid.uuid_lo = *(u64 *)&uuid->b[0];
> +	shared_uuid.uuid_hi = *(u64 *)&uuid->b[8];
>  	return xen_tmem_new_pool(shared_uuid, TMEM_POOL_SHARED, pagesize);
>  }
> 
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index 0b177da9ea82..6e3b4186a22f 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -3952,7 +3952,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
>  		sb->s_qcop = &ext4_qctl_operations;
>  	sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
>  #endif
> -	memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
> +	memcpy(&sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
> 
>  	INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
>  	mutex_init(&sbi->s_orphan_lock);
> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
> index 83355ec4a92c..0b89b0b7b9f7 100644
> --- a/fs/f2fs/super.c
> +++ b/fs/f2fs/super.c
> @@ -1937,7 +1937,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
>  	sb->s_time_gran = 1;
>  	sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
>  		(test_opt(sbi, POSIX_ACL) ? MS_POSIXACL : 0);
> -	memcpy(sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
> +	memcpy(&sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
> 
>  	/* init f2fs-specific super block info */
>  	sbi->valid_super_block = valid_super_block;
> diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
> index ed67548b286c..b92135c202c2 100644
> --- a/fs/gfs2/ops_fstype.c
> +++ b/fs/gfs2/ops_fstype.c
> @@ -203,7 +203,7 @@ static void gfs2_sb_in(struct gfs2_sbd *sdp, const void *buf)
> 
>  	memcpy(sb->sb_lockproto, str->sb_lockproto, GFS2_LOCKNAME_LEN);
>  	memcpy(sb->sb_locktable, str->sb_locktable, GFS2_LOCKNAME_LEN);
> -	memcpy(s->s_uuid, str->sb_uuid, 16);
> +	memcpy(&s->s_uuid, str->sb_uuid, 16);
>  }
> 
>  /**
> diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c
> index 7a515345610c..e77bc52b468f 100644
> --- a/fs/gfs2/sys.c
> +++ b/fs/gfs2/sys.c
> @@ -71,25 +71,14 @@ static ssize_t fsname_show(struct gfs2_sbd *sdp, char *buf)
>  	return snprintf(buf, PAGE_SIZE, "%s\n", sdp->sd_fsname);
>  }
> 
> -static int gfs2_uuid_valid(const u8 *uuid)
> -{
> -	int i;
> -
> -	for (i = 0; i < 16; i++) {
> -		if (uuid[i])
> -			return 1;
> -	}
> -	return 0;
> -}
> -
>  static ssize_t uuid_show(struct gfs2_sbd *sdp, char *buf)
>  {
>  	struct super_block *s = sdp->sd_vfs;
> -	const u8 *uuid = s->s_uuid;
> +
>  	buf[0] = '\0';
> -	if (!gfs2_uuid_valid(uuid))
> +	if (uuid_is_null(&s->s_uuid))
>  		return 0;
> -	return snprintf(buf, PAGE_SIZE, "%pUB\n", uuid);
> +	return snprintf(buf, PAGE_SIZE, "%pUB\n", &s->s_uuid);
>  }
> 
>  static ssize_t freeze_show(struct gfs2_sbd *sdp, char *buf)
> @@ -712,14 +701,13 @@ static int gfs2_uevent(struct kset *kset, struct kobject *kobj,
>  {
>  	struct gfs2_sbd *sdp = container_of(kobj, struct gfs2_sbd, sd_kobj);
>  	struct super_block *s = sdp->sd_vfs;
> -	const u8 *uuid = s->s_uuid;
> 
>  	add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name);
>  	add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name);
>  	if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags))
>  		add_uevent_var(env, "JOURNALID=%d", sdp->sd_lockstruct.ls_jid);
> -	if (gfs2_uuid_valid(uuid))
> -		add_uevent_var(env, "UUID=%pUB", uuid);
> +	if (!uuid_is_null(&s->s_uuid))
> +		add_uevent_var(env, "UUID=%pUB", &s->s_uuid);
>  	return 0;
>  }
> 
> diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
> index ca1646fbcaef..83005f486451 100644
> --- a/fs/ocfs2/super.c
> +++ b/fs/ocfs2/super.c
> @@ -2062,7 +2062,7 @@ static int ocfs2_initialize_super(struct super_block *sb,
>  	cbits = le32_to_cpu(di->id2.i_super.s_clustersize_bits);
>  	bbits = le32_to_cpu(di->id2.i_super.s_blocksize_bits);
>  	sb->s_maxbytes = ocfs2_max_file_offset(bbits, cbits);
> -	memcpy(sb->s_uuid, di->id2.i_super.s_uuid,
> +	memcpy(&sb->s_uuid, di->id2.i_super.s_uuid,
>  	       sizeof(di->id2.i_super.s_uuid));
> 
>  	osb->osb_dx_mask = (1 << (cbits - bbits)) - 1;
> diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
> index 9008ab9fbd2e..5b795873f7fa 100644
> --- a/fs/overlayfs/copy_up.c
> +++ b/fs/overlayfs/copy_up.c
> @@ -284,7 +284,6 @@ static int ovl_set_origin(struct dentry *dentry, struct dentry *lower,
>  			  struct dentry *upper)
>  {
>  	struct super_block *sb = lower->d_sb;
> -	uuid_be *uuid = (uuid_be *) &sb->s_uuid;
>  	const struct ovl_fh *fh = NULL;
>  	int err;
> 
> @@ -294,8 +293,8 @@ static int ovl_set_origin(struct dentry *dentry, struct dentry *lower,
>  	 * up and a pure upper inode.
>  	 */
>  	if (sb->s_export_op && sb->s_export_op->fh_to_dentry &&
> -	    uuid_be_cmp(*uuid, NULL_UUID_BE)) {
> -		fh = ovl_encode_fh(lower, uuid);
> +	    !uuid_is_null(&sb->s_uuid)) {
> +		fh = ovl_encode_fh(lower, &sb->s_uuid);
>  		if (IS_ERR(fh))
>  			return PTR_ERR(fh);
>  	}
> diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
> index bad0f665a635..6709f27c6876 100644
> --- a/fs/overlayfs/namei.c
> +++ b/fs/overlayfs/namei.c
> @@ -135,7 +135,7 @@ static struct dentry *ovl_get_origin(struct dentry *dentry,
>  	 * Make sure that the stored uuid matches the uuid of the lower
>  	 * layer where file handle will be decoded.
>  	 */
> -	if (uuid_be_cmp(fh->uuid, *(uuid_be *) &mnt->mnt_sb->s_uuid))
> +	if (!uuid_equal(&fh->uuid, &mnt->mnt_sb->s_uuid))
>  		goto out;
> 
>  	origin = exportfs_decode_fh(mnt, (struct fid *)fh->fid,
> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
> index 682b336a7a6a..6a18ae407713 100644
> --- a/fs/xfs/xfs_mount.c
> +++ b/fs/xfs/xfs_mount.c
> @@ -74,8 +74,7 @@ xfs_uuid_mount(
>  	int			hole, i;
> 
>  	/* Publish UUID in struct super_block */
> -	BUILD_BUG_ON(sizeof(mp->m_super->s_uuid) != sizeof(uuid_t));
> -	memcpy(&mp->m_super->s_uuid, uuid, sizeof(uuid_t));
> +	uuid_copy(&mp->m_super->s_uuid, uuid);
> 
>  	if (mp->m_flags & XFS_MOUNT_NOUUID)
>  		return 0;
> diff --git a/include/linux/cleancache.h b/include/linux/cleancache.h
> index fccf7f44139d..bbb3712dd892 100644
> --- a/include/linux/cleancache.h
> +++ b/include/linux/cleancache.h
> @@ -27,7 +27,7 @@ struct cleancache_filekey {
> 
>  struct cleancache_ops {
>  	int (*init_fs)(size_t);
> -	int (*init_shared_fs)(char *uuid, size_t);
> +	int (*init_shared_fs)(uuid_t *uuid, size_t);
>  	int (*get_page)(int, struct cleancache_filekey,
>  			pgoff_t, struct page *);
>  	void (*put_page)(int, struct cleancache_filekey,
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 803e5a9b2654..3e68cabb8457 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -30,6 +30,7 @@
>  #include <linux/percpu-rwsem.h>
>  #include <linux/workqueue.h>
>  #include <linux/delayed_call.h>
> +#include <linux/uuid.h>
> 
>  #include <asm/byteorder.h>
>  #include <uapi/linux/fs.h>
> @@ -1328,8 +1329,8 @@ struct super_block {
> 
>  	struct sb_writers	s_writers;
> 
> -	char s_id[32];				/* Informational name */
> -	u8 s_uuid[16];				/* UUID */
> +	char			s_id[32];	/* Informational name */
> +	uuid_t			s_uuid;		/* UUID */
> 
>  	void 			*s_fs_info;	/* Filesystem private info */
>  	unsigned int		s_max_links;
> diff --git a/mm/cleancache.c b/mm/cleancache.c
> index ba5d8f3e6d68..f7b9fdc79d97 100644
> --- a/mm/cleancache.c
> +++ b/mm/cleancache.c
> @@ -130,7 +130,7 @@ void __cleancache_init_shared_fs(struct super_block *sb)
>  	int pool_id = CLEANCACHE_NO_BACKEND_SHARED;
> 
>  	if (cleancache_ops) {
> -		pool_id = cleancache_ops->init_shared_fs(sb->s_uuid, PAGE_SIZE);
> +		pool_id = cleancache_ops->init_shared_fs(&sb->s_uuid, PAGE_SIZE);
>  		if (pool_id < 0)
>  			pool_id = CLEANCACHE_NO_POOL;
>  	}
> diff --git a/security/integrity/evm/evm_crypto.c b/security/integrity/evm/evm_crypto.c
> index d7f282d75cc1..1d32cd20009a 100644
> --- a/security/integrity/evm/evm_crypto.c
> +++ b/security/integrity/evm/evm_crypto.c
> @@ -164,7 +164,7 @@ static void hmac_add_misc(struct shash_desc *desc, struct inode *inode,
>  	hmac_misc.mode = inode->i_mode;
>  	crypto_shash_update(desc, (const u8 *)&hmac_misc, sizeof(hmac_misc));
>  	if (evm_hmac_attrs & EVM_ATTR_FSUUID)
> -		crypto_shash_update(desc, inode->i_sb->s_uuid,
> +		crypto_shash_update(desc, &inode->i_sb->s_uuid.b[0],
>  				    sizeof(inode->i_sb->s_uuid));
>  	crypto_shash_final(desc, digest);
>  }
> diff --git a/security/integrity/ima/ima_policy.c b/security/integrity/ima/ima_policy.c
> index da3e7d50e0d7..659dbcc83d2f 100644
> --- a/security/integrity/ima/ima_policy.c
> +++ b/security/integrity/ima/ima_policy.c
> @@ -244,7 +244,7 @@ static bool ima_match_rules(struct ima_rule_entry *rule, struct inode *inode,
>  	    && rule->fsmagic != inode->i_sb->s_magic)
>  		return false;
>  	if ((rule->flags & IMA_FSUUID) &&
> -	    memcmp(&rule->fsuuid, inode->i_sb->s_uuid, sizeof(rule->fsuuid)))
> +	    !uuid_equal(&rule->fsuuid, &inode->i_sb->s_uuid))
>  		return false;
>  	if ((rule->flags & IMA_UID) && !rule->uid_op(cred->uid, rule->uid))
>  		return false;

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ