|
@@ -324,34 +324,43 @@ try_again:
|
|
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;
|
|
|
|
- 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;
|
|
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,
|
|
|
|
- &unifilename)) {
|
|
|
|
|
|
+ if (!udf_CS0toNLS(UDF_SB(sb)->s_nls_map, 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
|
|
} 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;
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
|
|
+ goto out2;
|
|
|
|
+
|
|
|
|
+ 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,
|
|
int udf_put_filename(struct super_block *sb, const uint8_t *sname,
|