Skip to content

Commit 338d0f0

Browse files
Timo Warnstorvalds
Timo Warns
authored andcommitted
befs: Validate length of long symbolic links.
Signed-off-by: Timo Warns <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent b4fd4ae commit 338d0f0

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

fs/befs/linuxvfs.c

+14-9
Original file line numberDiff line numberDiff line change
@@ -474,17 +474,22 @@ befs_follow_link(struct dentry *dentry, struct nameidata *nd)
474474
befs_data_stream *data = &befs_ino->i_data.ds;
475475
befs_off_t len = data->size;
476476

477-
befs_debug(sb, "Follow long symlink");
478-
479-
link = kmalloc(len, GFP_NOFS);
480-
if (!link) {
481-
link = ERR_PTR(-ENOMEM);
482-
} else if (befs_read_lsymlink(sb, data, link, len) != len) {
483-
kfree(link);
484-
befs_error(sb, "Failed to read entire long symlink");
477+
if (len == 0) {
478+
befs_error(sb, "Long symlink with illegal length");
485479
link = ERR_PTR(-EIO);
486480
} else {
487-
link[len - 1] = '\0';
481+
befs_debug(sb, "Follow long symlink");
482+
483+
link = kmalloc(len, GFP_NOFS);
484+
if (!link) {
485+
link = ERR_PTR(-ENOMEM);
486+
} else if (befs_read_lsymlink(sb, data, link, len) != len) {
487+
kfree(link);
488+
befs_error(sb, "Failed to read entire long symlink");
489+
link = ERR_PTR(-EIO);
490+
} else {
491+
link[len - 1] = '\0';
492+
}
488493
}
489494
} else {
490495
link = befs_ino->i_data.symlink;

0 commit comments

Comments
 (0)