forked from mirrors/linux
		
	libfs: Create the helper function generic_ci_validate_strict_name()
Create a helper function for filesystems do the checks required for casefold directories and strict encoding. Suggested-by: Gabriel Krisman Bertazi <krisman@suse.de> Reviewed-by: Gabriel Krisman Bertazi <gabriel@krisman.be> Signed-off-by: André Almeida <andrealmeid@igalia.com> Link: https://lore.kernel.org/r/20241021-tonyk-tmpfs-v8-1-f443d5814194@igalia.com Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
		
							parent
							
								
									42f7652d3e
								
							
						
					
					
						commit
						0e152beb5a
					
				
					 1 changed files with 45 additions and 0 deletions
				
			
		|  | @ -45,6 +45,7 @@ | |||
| #include <linux/slab.h> | ||||
| #include <linux/maple_tree.h> | ||||
| #include <linux/rw_hint.h> | ||||
| #include <linux/unicode.h> | ||||
| 
 | ||||
| #include <asm/byteorder.h> | ||||
| #include <uapi/linux/fs.h> | ||||
|  | @ -3456,6 +3457,50 @@ extern int generic_ci_match(const struct inode *parent, | |||
| 			    const struct qstr *folded_name, | ||||
| 			    const u8 *de_name, u32 de_name_len); | ||||
| 
 | ||||
| #if IS_ENABLED(CONFIG_UNICODE) | ||||
| /**
 | ||||
|  * generic_ci_validate_strict_name - Check if a given name is suitable | ||||
|  * for a directory | ||||
|  * | ||||
|  * This functions checks if the proposed filename is valid for the | ||||
|  * parent directory. That means that only valid UTF-8 filenames will be | ||||
|  * accepted for casefold directories from filesystems created with the | ||||
|  * strict encoding flag.  That also means that any name will be | ||||
|  * accepted for directories that doesn't have casefold enabled, or | ||||
|  * aren't being strict with the encoding. | ||||
|  * | ||||
|  * @dir: inode of the directory where the new file will be created | ||||
|  * @name: name of the new file | ||||
|  * | ||||
|  * Return: | ||||
|  * * True if the filename is suitable for this directory. It can be | ||||
|  * true if a given name is not suitable for a strict encoding | ||||
|  * directory, but the directory being used isn't strict | ||||
|  * * False if the filename isn't suitable for this directory. This only | ||||
|  * happens when a directory is casefolded and the filesystem is strict | ||||
|  * about its encoding. | ||||
|  */ | ||||
| static inline bool generic_ci_validate_strict_name(struct inode *dir, struct qstr *name) | ||||
| { | ||||
| 	if (!IS_CASEFOLDED(dir) || !sb_has_strict_encoding(dir->i_sb)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * A casefold dir must have a encoding set, unless the filesystem | ||||
| 	 * is corrupted | ||||
| 	 */ | ||||
| 	if (WARN_ON_ONCE(!dir->i_sb->s_encoding)) | ||||
| 		return true; | ||||
| 
 | ||||
| 	return !utf8_validate(dir->i_sb->s_encoding, name); | ||||
| } | ||||
| #else | ||||
| static inline bool generic_ci_validate_strict_name(struct inode *dir, struct qstr *name) | ||||
| { | ||||
| 	return true; | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static inline bool sb_has_encoding(const struct super_block *sb) | ||||
| { | ||||
| #if IS_ENABLED(CONFIG_UNICODE) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 André Almeida
						André Almeida