mirror of https://gitee.com/openkylin/linux.git
udf: reduce stack usage of udf_get_filename
Allocate strings with kmalloc. Checkstack output: Before: udf_get_filename: 600 After: udf_get_filename: 136 Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com> Cc: Jan Kara <jack@suse.cz> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
ba9aadd80c
commit
530f1a5e3e
|
@ -324,34 +324,43 @@ static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni,
|
|||
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;
|
||||
goto out2;
|
||||
|
||||
len = udf_translate_to_linux(dname, filename.u_name, filename.u_len,
|
||||
unifilename.u_name, unifilename.u_len);
|
||||
if (len)
|
||||
return len;
|
||||
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue