kernfs: Fix range checks in kernfs_get_target_path
[ Upstream commit a75e78f21f9ad4b810868c89dbbabcc3931591ca ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
709426fc57
commit
39bd6a7496
1 changed files with 4 additions and 1 deletions
|
@ -63,6 +63,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;
|
||||||
|
@ -79,7 +82,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…
Add table
Reference in a new issue