udf: Adjust UDF_NAME_LEN to better reflect actual restrictions
authorAndrew Gabbasov <andrew_gabbasov@mentor.com>
Fri, 15 Jan 2016 08:44:21 +0000 (02:44 -0600)
committerJan Kara <jack@suse.cz>
Tue, 9 Feb 2016 12:05:23 +0000 (13:05 +0100)
Actual name length restriction is 254 bytes, this is used in 'ustr'
structure, and this is what fits into UDF File Ident structures.
And in most cases the constant is used as UDF_NAME_LEN-2.
So, it's better to just modify the constant to make it closer
to reality.

Also, in some cases it's useful to have a separate constant for
the maximum length of file name field in CS0 encoding in UDF File
Ident structures.

Also, remove the unused UDF_PATH_LEN constant.

Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/udf/namei.c
fs/udf/super.c
fs/udf/udfdecl.h
fs/udf/unicode.c

index f82c70d73aba92c90728e168dd3e14f73f26378c..9eb9c6440270a3c0cd6aa1400bb663ef170cb904 100644 (file)
@@ -291,7 +291,7 @@ static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
        struct udf_fileident_bh fibh;
        struct fileIdentDesc *fi;
 
-       if (dentry->d_name.len > UDF_NAME_LEN - 2)
+       if (dentry->d_name.len > UDF_NAME_LEN)
                return ERR_PTR(-ENAMETOOLONG);
 
 #ifdef UDF_RECOVERY
@@ -351,7 +351,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
        struct udf_inode_info *dinfo;
 
        fibh->sbh = fibh->ebh = NULL;
-       name = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+       name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
        if (!name) {
                *err = -ENOMEM;
                goto out_err;
@@ -364,7 +364,7 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir,
                }
                namelen = udf_put_filename(sb, dentry->d_name.name,
                                           dentry->d_name.len,
-                                          name, UDF_NAME_LEN);
+                                          name, UDF_NAME_LEN_CS0);
                if (!namelen) {
                        *err = -ENAMETOOLONG;
                        goto out_err;
@@ -915,7 +915,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
 
        iinfo = UDF_I(inode);
        down_write(&iinfo->i_data_sem);
-       name = kmalloc(UDF_NAME_LEN, GFP_NOFS);
+       name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
        if (!name) {
                err = -ENOMEM;
                goto out_no_entry;
@@ -1000,7 +1000,7 @@ static int udf_symlink(struct inode *dir, struct dentry *dentry,
                if (pc->componentType == 5) {
                        namelen = udf_put_filename(sb, compstart,
                                                   symname - compstart,
-                                                  name, UDF_NAME_LEN);
+                                                  name, UDF_NAME_LEN_CS0);
                        if (!namelen)
                                goto out_no_entry;
 
index a522c15a0bfd7e5e9e0d758bfbc59185a8cb2609..ffb35f7eab380dac8105426485645e8d86c9f750 100644 (file)
@@ -2358,7 +2358,7 @@ static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
                                          le32_to_cpu(lvidiu->numDirs)) : 0)
                        + buf->f_bfree;
        buf->f_ffree = buf->f_bfree;
-       buf->f_namelen = UDF_NAME_LEN - 2;
+       buf->f_namelen = UDF_NAME_LEN;
        buf->f_fsid.val[0] = (u32)id;
        buf->f_fsid.val[1] = (u32)(id >> 32);
 
index 4a47c72676143efcd38f61700579444495f631f4..47a228248c5b39fd86ac31c8c004b6291f4511a8 100644 (file)
@@ -49,8 +49,8 @@ extern __printf(3, 4) void _udf_warn(struct super_block *sb,
 #define UDF_EXTENT_FLAG_MASK   0xC0000000
 
 #define UDF_NAME_PAD           4
-#define UDF_NAME_LEN           256
-#define UDF_PATH_LEN           1023
+#define UDF_NAME_LEN           254
+#define UDF_NAME_LEN_CS0       255
 
 static inline size_t udf_file_entry_alloc_offset(struct inode *inode)
 {
@@ -108,7 +108,7 @@ struct generic_desc {
 
 struct ustr {
        uint8_t u_cmpID;
-       uint8_t u_name[UDF_NAME_LEN - 2];
+       uint8_t u_name[UDF_NAME_LEN];
        uint8_t u_len;
 };
 
index 4d7a674ebce51932bd51d7ceeea780cd209ea4c8..5599e753540106fda07e2d79790dccd7447c37bd 100644 (file)
@@ -33,7 +33,7 @@ static int udf_translate_to_linux(uint8_t *, int, uint8_t *, int, uint8_t *,
 
 static int udf_char_to_ustr(struct ustr *dest, const uint8_t *src, int strlen)
 {
-       if ((!dest) || (!src) || (!strlen) || (strlen > UDF_NAME_LEN - 2))
+       if ((!dest) || (!src) || (!strlen) || (strlen > UDF_NAME_LEN))
                return 0;
 
        memset(dest, 0, sizeof(struct ustr));
@@ -184,14 +184,14 @@ static int udf_name_from_CS0(struct ustr *utf_o,
 
        ocu = ocu_i->u_name;
        utf_o->u_len = 0;
-       for (i = 0; (i < ocu_len) && (utf_o->u_len <= (UDF_NAME_LEN - 3));) {
+       for (i = 0; (i < ocu_len) && (utf_o->u_len < UDF_NAME_LEN);) {
                /* Expand OSTA compressed Unicode to Unicode */
                uint32_t c = ocu[i++];
                if (cmp_id == 16)
                        c = (c << 8) | ocu[i++];
 
                len = conv_f(c, &utf_o->u_name[utf_o->u_len],
-                            UDF_NAME_LEN - 2 - utf_o->u_len);
+                            UDF_NAME_LEN - utf_o->u_len);
                /* Valid character? */
                if (len >= 0)
                        utf_o->u_len += len;