diff options
Diffstat (limited to 'fs/udf/unicode.c')
| -rw-r--r-- | fs/udf/unicode.c | 39 | 
1 files changed, 24 insertions, 15 deletions
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c index 9fdf8c93c58..a3bbdbde9f4 100644 --- a/fs/udf/unicode.c +++ b/fs/udf/unicode.c @@ -324,34 +324,43 @@ try_again:  int udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname,  		     int flen)  { -	struct ustr filename, unifilename; -	int len; +	struct ustr *filename, *unifilename; +	int len = 0; -	if (udf_build_ustr_exact(&unifilename, sname, flen)) +	filename = kmalloc(sizeof(struct ustr), GFP_NOFS); +	if (!filename)  		return 0; +	unifilename = kmalloc(sizeof(struct ustr), GFP_NOFS); +	if (!unifilename) +		goto out1; + +	if (udf_build_ustr_exact(unifilename, sname, flen)) +		goto out2; +  	if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8)) { -		if (!udf_CS0toUTF8(&filename, &unifilename)) { +		if (!udf_CS0toUTF8(filename, unifilename)) {  			udf_debug("Failed in udf_get_filename: sname = %s\n",  				  sname); -			return 0; +			goto out2;  		}  	} else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { -		if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename, -				  &unifilename)) { +		if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, filename, +				  unifilename)) {  			udf_debug("Failed in udf_get_filename: sname = %s\n",  				  sname); -			return 0; +			goto out2;  		}  	} else -		return 0; - -	len = udf_translate_to_linux(dname, filename.u_name, filename.u_len, -				     unifilename.u_name, unifilename.u_len); -	if (len) -		return len; +		goto out2; -	return 0; +	len = udf_translate_to_linux(dname, filename->u_name, filename->u_len, +				     unifilename->u_name, unifilename->u_len); +out2: +	kfree(unifilename); +out1: +	kfree(filename); +	return len;  }  int udf_put_filename(struct super_block *sb, const uint8_t *sname,  |