Commit f2e467a
eventpoll: Fix semi-unbounded recursion
Ensure that epoll instances can never form a graph deeper than
EP_MAX_NESTS+1 links.
Currently, ep_loop_check_proc() ensures that the graph is loop-free and
does some recursion depth checks, but those recursion depth checks don't
limit the depth of the resulting tree for two reasons:
- They don't look upwards in the tree.
- If there are multiple downwards paths of different lengths, only one of
the paths is actually considered for the depth check since commit
28d82dc ("epoll: limit paths").
Essentially, the current recursion depth check in ep_loop_check_proc() just
serves to prevent it from recursing too deeply while checking for loops.
A more thorough check is done in reverse_path_check() after the new graph
edge has already been created; this checks, among other things, that no
paths going upwards from any non-epoll file with a length of more than 5
edges exist. However, this check does not apply to non-epoll files.
As a result, it is possible to recurse to a depth of at least roughly 500,
tested on v6.15. (I am unsure if deeper recursion is possible; and this may
have changed with commit 8c44dac ("eventpoll: Fix priority inversion
problem").)
To fix it:
1. In ep_loop_check_proc(), note the subtree depth of each visited node,
and use subtree depths for the total depth calculation even when a subtree
has already been visited.
2. Add ep_get_upwards_depth_proc() for similarly determining the maximum
depth of an upwards walk.
3. In ep_loop_check(), use these values to limit the total path length
between epoll nodes to EP_MAX_NESTS edges.
Fixes: 22bacca ("epoll: prevent creating circular epoll structures")
Cc: stable@vger.kernel.org
Signed-off-by: Jann Horn <jannh@google.com>
Link: https://lore.kernel.org/20250711-epoll-recursion-fix-v1-1-fb2457c33292@google.com
Signed-off-by: Christian Brauner <brauner@kernel.org>1 parent 3bc4e44 commit f2e467a
1 file changed
Lines changed: 46 additions & 14 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
218 | 218 | | |
219 | 219 | | |
220 | 220 | | |
| 221 | + | |
221 | 222 | | |
222 | 223 | | |
223 | 224 | | |
| |||
2142 | 2143 | | |
2143 | 2144 | | |
2144 | 2145 | | |
2145 | | - | |
2146 | | - | |
2147 | | - | |
2148 | | - | |
| 2146 | + | |
| 2147 | + | |
| 2148 | + | |
2149 | 2149 | | |
2150 | 2150 | | |
2151 | 2151 | | |
2152 | 2152 | | |
2153 | | - | |
2154 | | - | |
| 2153 | + | |
2155 | 2154 | | |
2156 | 2155 | | |
2157 | 2156 | | |
2158 | | - | |
| 2157 | + | |
2159 | 2158 | | |
2160 | 2159 | | |
2161 | 2160 | | |
| 2161 | + | |
| 2162 | + | |
| 2163 | + | |
2162 | 2164 | | |
2163 | 2165 | | |
2164 | 2166 | | |
2165 | 2167 | | |
2166 | 2168 | | |
2167 | 2169 | | |
2168 | 2170 | | |
2169 | | - | |
2170 | | - | |
2171 | 2171 | | |
2172 | | - | |
| 2172 | + | |
2173 | 2173 | | |
2174 | | - | |
2175 | | - | |
| 2174 | + | |
| 2175 | + | |
2176 | 2176 | | |
2177 | 2177 | | |
2178 | 2178 | | |
| |||
2186 | 2186 | | |
2187 | 2187 | | |
2188 | 2188 | | |
| 2189 | + | |
2189 | 2190 | | |
2190 | 2191 | | |
2191 | | - | |
| 2192 | + | |
| 2193 | + | |
| 2194 | + | |
| 2195 | + | |
| 2196 | + | |
| 2197 | + | |
| 2198 | + | |
| 2199 | + | |
| 2200 | + | |
| 2201 | + | |
| 2202 | + | |
| 2203 | + | |
| 2204 | + | |
| 2205 | + | |
| 2206 | + | |
| 2207 | + | |
| 2208 | + | |
| 2209 | + | |
2192 | 2210 | | |
2193 | 2211 | | |
2194 | 2212 | | |
| |||
2204 | 2222 | | |
2205 | 2223 | | |
2206 | 2224 | | |
| 2225 | + | |
| 2226 | + | |
2207 | 2227 | | |
2208 | | - | |
| 2228 | + | |
| 2229 | + | |
| 2230 | + | |
| 2231 | + | |
| 2232 | + | |
| 2233 | + | |
| 2234 | + | |
| 2235 | + | |
| 2236 | + | |
| 2237 | + | |
| 2238 | + | |
| 2239 | + | |
| 2240 | + | |
2209 | 2241 | | |
2210 | 2242 | | |
2211 | 2243 | | |
| |||
0 commit comments