aboutsummaryrefslogtreecommitdiffstats
path: root/fs/udf/unicode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/udf/unicode.c')
-rw-r--r--fs/udf/unicode.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/udf/unicode.c b/fs/udf/unicode.c
index 05bc505ec01a..24d6165d21a9 100644
--- a/fs/udf/unicode.c
+++ b/fs/udf/unicode.c
@@ -48,14 +48,16 @@ int udf_build_ustr(struct ustr *dest, dstring *ptr, int size)
48{ 48{
49 int usesize; 49 int usesize;
50 50
51 if ((!dest) || (!ptr) || (!size)) 51 if (!dest || !ptr || !size)
52 return -1; 52 return -1;
53 BUG_ON(size < 2);
53 54
54 memset(dest, 0, sizeof(struct ustr)); 55 usesize = min_t(size_t, ptr[size - 1], sizeof(dest->u_name));
55 usesize = (size > UDF_NAME_LEN) ? UDF_NAME_LEN : size; 56 usesize = min(usesize, size - 2);
56 dest->u_cmpID = ptr[0]; 57 dest->u_cmpID = ptr[0];
57 dest->u_len = ptr[size - 1]; 58 dest->u_len = usesize;
58 memcpy(dest->u_name, ptr + 1, usesize - 1); 59 memcpy(dest->u_name, ptr + 1, usesize);
60 memset(dest->u_name + usesize, 0, sizeof(dest->u_name) - usesize);
59 61
60 return 0; 62 return 0;
61} 63}