Re: [PATCH] metadump: obfuscate symlinks by path component

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

 



On 4/9/12 11:34 PM, Eric Sandeen wrote:
> xfs_metadump currently obfuscates entire symlinks without regard
> to path components; this can lead to a corrupt image when restoring
> a metadump containing extremely long symlinks:
> 
> Phase 3 - for each AG...
>         - scan and clear agi unlinked lists...
>         - process known inodes and perform inode discovery...
>         - agno = 0
> component of symlink in inode 145 too long
> problem with symbolic link in inode 145
> cleared inode 145
> ... <more trail of woe>
> 
> Fix this by consolidating symlink obfuscation into a new
> function which obfuscates one path component at a time.
> 
> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>

ping? :)

> ---
> 
> Yes, I need to do an xfstest for this.  metadumping a filesystem
> after fsstressing it works well.
> 
> diff --git a/db/metadump.c b/db/metadump.c
> index c5ffddb..9f15d9e 100644
> --- a/db/metadump.c
> +++ b/db/metadump.c
> @@ -956,6 +956,40 @@ obfuscate_sf_dir(
>  }
>  
>  static void
> +obfuscate_path_components(
> +	char			*buf,
> +	__uint64_t		len)
> +{
> +	uchar_t			*comp;
> +	xfs_dahash_t		hash;
> +
> +	comp = (uchar_t *)buf;
> +	while (comp < (uchar_t *)buf + len) {
> +		char	*slash;
> +		int	namelen;
> +
> +		/* find slash at end of this component */
> +		slash = strchr((char *)comp, '/');
> +		if (!slash) {
> +			/* last (or single) component */
> +			namelen = strlen((char *)comp);
> +			hash = libxfs_da_hashname(comp, namelen);
> +			obfuscate_name(hash, namelen, comp);
> +			break;
> +		}
> +		namelen = slash - (char *)comp;
> +		/* handle leading or consecutive slashes */
> +		if (!namelen) {
> +			comp++;
> +			continue;
> +		}
> +		hash = libxfs_da_hashname(comp, namelen);
> +		obfuscate_name(hash, namelen, comp);
> +		comp += namelen + 1;
> +	}
> +}
> +
> +static void
>  obfuscate_sf_symlink(
>  	xfs_dinode_t		*dip)
>  {
> @@ -971,8 +1005,7 @@ obfuscate_sf_symlink(
>  	}
>  
>  	buf = (char *)XFS_DFORK_DPTR(dip);
> -	while (len > 0)
> -		buf[--len] = random() % 127 + 1;
> +	obfuscate_path_components(buf, len);
>  }
>  
>  static void
> @@ -1176,11 +1209,8 @@ obfuscate_symlink_blocks(
>  	char			*block,
>  	xfs_dfilblks_t		count)
>  {
> -	int 			i;
> -
>  	count <<= mp->m_sb.sb_blocklog;
> -	for (i = 0; i < count; i++)
> -		block[i] = random() % 127 + 1;
> +	obfuscate_path_components(block, count);
>  }
>  
>  #define MAX_REMOTE_VALS		4095
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs
> 

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs


[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux