From: Jann Horn <[email protected]>

commit fdcfce93073d990ed4b71752e31ad1c1d6e9d58b upstream.

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 <[email protected]>
Fixes: f2e467a48287 ("eventpoll: Fix semi-unbounded recursion")
Cc: [email protected]
Signed-off-by: Jann Horn <[email protected]>
Link: 
https://patch.msgid.link/[email protected]
Signed-off-by: Christian Brauner <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
(cherry picked from commit 029be23f553bdc544680b1fe7d16c4d2a75ee7a0)
Signed-off-by: Eva Kurchatova <[email protected]>

https://virtuozzo.atlassian.net/browse/VSTOR-137490
Feature: fix epoll cve
---
 fs/eventpoll.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 2ff37c329d10..133a38f63677 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -2041,7 +2041,8 @@ static int ep_poll(struct eventpoll *ep, struct 
epoll_event __user *events,
  * @ep: the &struct eventpoll to be currently checked.
  * @depth: Current depth of the path being checked.
  *
- * Return: depth of the subtree, or INT_MAX if we found a loop or went too 
deep.
+ * Return: depth of the subtree, or a value bigger than EP_MAX_NESTS if we 
found
+ * a loop or went too deep.
  */
 static int ep_loop_check_proc(struct eventpoll *ep, int depth)
 {
@@ -2060,7 +2061,7 @@ static int ep_loop_check_proc(struct eventpoll *ep, int 
depth)
                        struct eventpoll *ep_tovisit;
                        ep_tovisit = epi->ffd.file->private_data;
                        if (ep_tovisit == inserting_into || depth > 
EP_MAX_NESTS)
-                               result = INT_MAX;
+                               result = EP_MAX_NESTS+1;
                        else
                                result = max(result, 
ep_loop_check_proc(ep_tovisit, depth + 1) + 1);
                        if (result > EP_MAX_NESTS)
-- 
2.55.0

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to