Commit 688a99e
authored
Merge commit from fork
* Bound total expansion length across comma alternatives
`maxLength` was enforced in `combine`, the one place output grows, but not on
the `values` array built to feed it. Each alternative in `{a,b,c,...}` is
expanded by its own `expand_` call, so each received a full independent
`maxLength` allowance, and the results were concatenated with no running total.
With `A` alternatives, `values` could reach `A * maxLength` characters before
`combine` ever got the chance to truncate it.
A ~25 KB input with 400 alternatives grew `values` past the heap limit and
crashed the process with an uncatchable out-of-memory error, bypassing the
mitigation added in 5.0.8 for CVE-2026-14257.
Track the running result count and character length while appending
alternatives, and stop once either bound is reached.
* Apply maxLength while generating sequences
`expandSequence` was bounded by `max`, the result count, but never consulted
`maxLength`. A padded element's width follows the input, so a wide pad made it
generate `max` wide elements only for `combine` to discard nearly all of them.
Memory stays flat here, since V8 represents those padded strings as
cons-strings, which is likely why this path was not caught alongside the
memory-exhaustion issue. The cost is time instead, proportional to
`max * width`: a ~400 KB input blocked the event loop for over two minutes.
Pass `maxLength` into the generation loop and stop once the sequence's own
characters reach it. Output is byte-identical; only the discarded work is
removed. The same input now returns in ~18 ms.
* fix: don't count dropped empties against `max`
Capping the intermediate `values` array at `max` entries counted
alternatives that `combine` goes on to drop as empty, so `max` stopped
bounding the number of *kept* results: `expand('{a,,b}', { max: 2 })`
returned `['a']` where it used to return `['a', 'b']`.
Skip those values rather than counting them. The cap itself stays - it is
what bounds the array when the values are empty and so contribute no
characters for `maxLength` to see.1 parent c66e5f9 commit 688a99e
2 files changed
Lines changed: 117 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
161 | 161 | | |
162 | 162 | | |
163 | 163 | | |
| 164 | + | |
164 | 165 | | |
165 | 166 | | |
166 | 167 | | |
| |||
186 | 187 | | |
187 | 188 | | |
188 | 189 | | |
| 190 | + | |
189 | 191 | | |
190 | 192 | | |
191 | 193 | | |
| |||
207 | 209 | | |
208 | 210 | | |
209 | 211 | | |
| 212 | + | |
210 | 213 | | |
| 214 | + | |
211 | 215 | | |
212 | 216 | | |
213 | 217 | | |
| |||
290 | 294 | | |
291 | 295 | | |
292 | 296 | | |
293 | | - | |
| 297 | + | |
294 | 298 | | |
295 | 299 | | |
296 | 300 | | |
| |||
314 | 318 | | |
315 | 319 | | |
316 | 320 | | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
317 | 333 | | |
318 | | - | |
319 | | - | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
320 | 346 | | |
321 | 347 | | |
322 | 348 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
277 | 277 | | |
278 | 278 | | |
279 | 279 | | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
0 commit comments