Skip to content

Commit fdcfce9

Browse files
thejhbrauner
authored andcommitted
eventpoll: Fix integer overflow in ep_loop_check_proc()
If a recursive call to ep_loop_check_proc() hits the `result = INT_MAX`, an integer overflow will occur in the calling ep_loop_check_proc() at `result = max(result, ep_loop_check_proc(ep_tovisit, depth + 1) + 1)`, breaking the recursion depth check. Fix it by using a different placeholder value that can't lead to an overflow. Reported-by: Guenter Roeck <linux@roeck-us.net> Fixes: f2e467a ("eventpoll: Fix semi-unbounded recursion") Cc: stable@vger.kernel.org Signed-off-by: Jann Horn <jannh@google.com> Link: https://patch.msgid.link/20260223-epoll-int-overflow-v1-1-452f35132224@google.com Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent f6a4954 commit fdcfce9

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

fs/eventpoll.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2061,7 +2061,8 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
20612061
* @ep: the &struct eventpoll to be currently checked.
20622062
* @depth: Current depth of the path being checked.
20632063
*
2064-
* Return: depth of the subtree, or INT_MAX if we found a loop or went too deep.
2064+
* Return: depth of the subtree, or a value bigger than EP_MAX_NESTS if we found
2065+
* a loop or went too deep.
20652066
*/
20662067
static int ep_loop_check_proc(struct eventpoll *ep, int depth)
20672068
{
@@ -2080,7 +2081,7 @@ static int ep_loop_check_proc(struct eventpoll *ep, int depth)
20802081
struct eventpoll *ep_tovisit;
20812082
ep_tovisit = epi->ffd.file->private_data;
20822083
if (ep_tovisit == inserting_into || depth > EP_MAX_NESTS)
2083-
result = INT_MAX;
2084+
result = EP_MAX_NESTS+1;
20842085
else
20852086
result = max(result, ep_loop_check_proc(ep_tovisit, depth + 1) + 1);
20862087
if (result > EP_MAX_NESTS)

0 commit comments

Comments
 (0)