kernfs: Fix range checks in kernfs_get_target_path
The terminating NUL byte is only there because the buffer is allocated with kzalloc(PAGE_SIZE, GFP_KERNEL), but since the range-check is off-by-one, and PAGE_SIZE==PATH_MAX, the returned string may not be zero-terminated if it is exactly PATH_MAX characters long. Furthermore also the initial loop may theoretically exceed PATH_MAX and cause a fault. Signed-off-by: Bernd Edlinger <bernd.edlinger@hotmail.de> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
bdae566d5d
Коммит
a75e78f21f
|
@ -72,6 +72,9 @@ static int kernfs_get_target_path(struct kernfs_node *parent,
|
|||
if (base == kn)
|
||||
break;
|
||||
|
||||
if ((s - path) + 3 >= PATH_MAX)
|
||||
return -ENAMETOOLONG;
|
||||
|
||||
strcpy(s, "../");
|
||||
s += 3;
|
||||
base = base->parent;
|
||||
|
@ -88,7 +91,7 @@ static int kernfs_get_target_path(struct kernfs_node *parent,
|
|||
if (len < 2)
|
||||
return -EINVAL;
|
||||
len--;
|
||||
if ((s - path) + len > PATH_MAX)
|
||||
if ((s - path) + len >= PATH_MAX)
|
||||
return -ENAMETOOLONG;
|
||||
|
||||
/* reverse fillup of target string from target to base */
|
||||
|
|
Загрузка…
Ссылка в новой задаче