Commit 530f1a5e authored by Marcin Slusarz's avatar Marcin Slusarz Committed by Jan Kara

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: default avatarMarcin Slusarz <marcin.slusarz@gmail.com>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent ba9aadd8
...@@ -324,34 +324,43 @@ static int udf_NLStoCS0(struct nls_table *nls, dstring *ocu, struct ustr *uni, ...@@ -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 udf_get_filename(struct super_block *sb, uint8_t *sname, uint8_t *dname,
int flen) int flen)
{ {
struct ustr filename, unifilename; struct ustr *filename, *unifilename;
int len; int len = 0;
if (udf_build_ustr_exact(&unifilename, sname, flen)) filename = kmalloc(sizeof(struct ustr), GFP_NOFS);
if (!filename)
return 0; 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_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", udf_debug("Failed in udf_get_filename: sname = %s\n",
sname); sname);
return 0; goto out2;
} }
} else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) { } else if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP)) {
if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, &filename, if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, filename,
&unifilename)) { unifilename)) {
udf_debug("Failed in udf_get_filename: sname = %s\n", udf_debug("Failed in udf_get_filename: sname = %s\n",
sname); sname);
return 0; goto out2;
} }
} else } else
return 0; goto out2;
len = udf_translate_to_linux(dname, filename.u_name, filename.u_len, len = udf_translate_to_linux(dname, filename->u_name, filename->u_len,
unifilename.u_name, unifilename.u_len); unifilename->u_name, unifilename->u_len);
if (len) out2:
kfree(unifilename);
out1:
kfree(filename);
return len; return len;
return 0;
} }
int udf_put_filename(struct super_block *sb, const uint8_t *sname, int udf_put_filename(struct super_block *sb, const uint8_t *sname,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment