forked from Minki/linux
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:
parent
bdae566d5d
commit
a75e78f21f
@ -72,6 +72,9 @@ static int kernfs_get_target_path(struct kernfs_node *parent,
|
|||||||
if (base == kn)
|
if (base == kn)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if ((s - path) + 3 >= PATH_MAX)
|
||||||
|
return -ENAMETOOLONG;
|
||||||
|
|
||||||
strcpy(s, "../");
|
strcpy(s, "../");
|
||||||
s += 3;
|
s += 3;
|
||||||
base = base->parent;
|
base = base->parent;
|
||||||
@ -88,7 +91,7 @@ static int kernfs_get_target_path(struct kernfs_node *parent,
|
|||||||
if (len < 2)
|
if (len < 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
len--;
|
len--;
|
||||||
if ((s - path) + len > PATH_MAX)
|
if ((s - path) + len >= PATH_MAX)
|
||||||
return -ENAMETOOLONG;
|
return -ENAMETOOLONG;
|
||||||
|
|
||||||
/* reverse fillup of target string from target to base */
|
/* reverse fillup of target string from target to base */
|
||||||
|
Loading…
Reference in New Issue
Block a user