Skip to content

Commit 2e111f3

Browse files
committed
coalesce consecutive non-globstar * characters
Fix: GHSA-3ppc-4f35-3m26
1 parent 1a62a2a commit 2e111f3

File tree

7 files changed

+105
-94
lines changed

7 files changed

+105
-94
lines changed

src/ast.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -633,13 +633,24 @@ export class AST {
633633
let escaping = false
634634
let re = ''
635635
let uflag = false
636+
// multiple stars that aren't globstars coalesce into one *
637+
let inStar = false
636638
for (let i = 0; i < glob.length; i++) {
637639
const c = glob.charAt(i)
638640
if (escaping) {
639641
escaping = false
640642
re += (reSpecials.has(c) ? '\\' : '') + c
641643
continue
642644
}
645+
if (c === '*') {
646+
if (inStar) continue
647+
inStar = true
648+
re += noEmpty && /^[*]+$/.test(glob) ? starNoEmpty : star
649+
hasMagic = true
650+
continue
651+
} else {
652+
inStar = false
653+
}
643654
if (c === '\\') {
644655
if (i === glob.length - 1) {
645656
re += '\\\\'
@@ -658,11 +669,6 @@ export class AST {
658669
continue
659670
}
660671
}
661-
if (c === '*') {
662-
re += noEmpty && glob === '*' ? starNoEmpty : star
663-
hasMagic = true
664-
continue
665-
}
666672
if (c === '?') {
667673
re += qmark
668674
hasMagic = true

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ export class Minimatch {
520520
// to the right as possible, even if it increases the number
521521
// of patterns that we have to process.
522522
preprocess(globParts: string[][]) {
523-
// if we're not in globstar mode, then turn all ** into *
523+
// if we're not in globstar mode, then turn ** into *
524524
if (this.options.noglobstar) {
525525
for (let i = 0; i < globParts.length; i++) {
526526
for (let j = 0; j < globParts[i].length; j++) {

tap-snapshots/test/basic.js.test.cjs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3440,11 +3440,11 @@ exports[`test/basic.js > TAP > basic tests > makeRe ??? 2`] = `
34403440
`
34413441

34423442
exports[`test/basic.js > TAP > basic tests > makeRe ??**********?****? 1`] = `
3443-
/^(?!\\.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]$/
3443+
/^(?!\\.)[^/][^/][^/]*?[^/][^/]*?[^/]$/
34443444
`
34453445

34463446
exports[`test/basic.js > TAP > basic tests > makeRe ??**********?****c 1`] = `
3447-
/^(?!\\.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c$/
3447+
/^(?!\\.)[^/][^/][^/]*?[^/][^/]*?c$/
34483448
`
34493449

34503450
exports[`test/basic.js > TAP > basic tests > makeRe ?.js 1`] = `
@@ -3472,27 +3472,27 @@ exports[`test/basic.js > TAP > basic tests > makeRe ?(x-!(y)|z)b 1`] = `
34723472
`
34733473

34743474
exports[`test/basic.js > TAP > basic tests > makeRe ?***?**** 1`] = `
3475-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?$/
3475+
/^(?!\\.)[^/][^/]*?[^/][^/]*?$/
34763476
`
34773477

34783478
exports[`test/basic.js > TAP > basic tests > makeRe ?***?****? 1`] = `
3479-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]$/
3479+
/^(?!\\.)[^/][^/]*?[^/][^/]*?[^/]$/
34803480
`
34813481

34823482
exports[`test/basic.js > TAP > basic tests > makeRe ?***?****c 1`] = `
3483-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c$/
3483+
/^(?!\\.)[^/][^/]*?[^/][^/]*?c$/
34843484
`
34853485

34863486
exports[`test/basic.js > TAP > basic tests > makeRe ?*****?? 1`] = `
3487-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]$/
3487+
/^(?!\\.)[^/][^/]*?[^/][^/]$/
34883488
`
34893489

34903490
exports[`test/basic.js > TAP > basic tests > makeRe ?*****?c 1`] = `
3491-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c$/
3491+
/^(?!\\.)[^/][^/]*?[^/]c$/
34923492
`
34933493

34943494
exports[`test/basic.js > TAP > basic tests > makeRe ?************c****?**** 1`] = `
3495-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?$/
3495+
/^(?!\\.)[^/][^/]*?c[^/]*?[^/][^/]*?$/
34963496
`
34973497

34983498
exports[`test/basic.js > TAP > basic tests > makeRe ?js 1`] = `
@@ -3864,15 +3864,15 @@ exports[`test/basic.js > TAP > basic tests > makeRe ** 3`] = `
38643864
`
38653865

38663866
exports[`test/basic.js > TAP > basic tests > makeRe *****?? 1`] = `
3867-
/^(?!\\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]$/
3867+
/^(?!\\.)[^/]*?[^/][^/]$/
38683868
`
38693869

38703870
exports[`test/basic.js > TAP > basic tests > makeRe *******? 1`] = `
3871-
/^(?!\\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]$/
3871+
/^(?!\\.)[^/]*?[^/]$/
38723872
`
38733873

38743874
exports[`test/basic.js > TAP > basic tests > makeRe *******c 1`] = `
3875-
/^(?!\\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c$/
3875+
/^(?!\\.)[^/]*?c$/
38763876
`
38773877

38783878
exports[`test/basic.js > TAP > basic tests > makeRe **/.x/** 1`] = `
@@ -3900,7 +3900,7 @@ exports[`test/basic.js > TAP > basic tests > makeRe *\\\\!* 1`] = `
39003900
`
39013901

39023902
exports[`test/basic.js > TAP > basic tests > makeRe *c*?** 1`] = `
3903-
/^(?!\\.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?$/
3903+
/^(?!\\.)[^/]*?c[^/]*?[^/][^/]*?$/
39043904
`
39053905

39063906
exports[`test/basic.js > TAP > basic tests > makeRe *js 1`] = `
@@ -4044,43 +4044,43 @@ exports[`test/basic.js > TAP > basic tests > makeRe a*[^c] 1`] = `
40444044
`
40454045

40464046
exports[`test/basic.js > TAP > basic tests > makeRe a**?**cd**?**??***k 1`] = `
4047-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k$/
4047+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/][^/]*?k$/
40484048
`
40494049

40504050
exports[`test/basic.js > TAP > basic tests > makeRe a**?**cd**?**??***k** 1`] = `
4051-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?$/
4051+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/][^/]*?k[^/]*?$/
40524052
`
40534053

40544054
exports[`test/basic.js > TAP > basic tests > makeRe a**?**cd**?**??k 1`] = `
4055-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k$/
4055+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/]k$/
40564056
`
40574057

40584058
exports[`test/basic.js > TAP > basic tests > makeRe a**?**cd**?**??k*** 1`] = `
4059-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?$/
4059+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/]k[^/]*?$/
40604060
`
40614061

40624062
exports[`test/basic.js > TAP > basic tests > makeRe a*****?c 1`] = `
4063-
/^a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c$/
4063+
/^a[^/]*?[^/]c$/
40644064
`
40654065

40664066
exports[`test/basic.js > TAP > basic tests > makeRe a********???******* 1`] = `
4067-
/^a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?$/
4067+
/^a[^/]*?[^/][^/][^/][^/]*?$/
40684068
`
40694069

40704070
exports[`test/basic.js > TAP > basic tests > makeRe a*****c*?** 1`] = `
4071-
/^a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?$/
4071+
/^a[^/]*?c[^/]*?[^/][^/]*?$/
40724072
`
40734073

40744074
exports[`test/basic.js > TAP > basic tests > makeRe a****c**?**??***** 1`] = `
4075-
/^a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?$/
4075+
/^a[^/]*?c[^/]*?[^/][^/]*?[^/][^/][^/]*?$/
40764076
`
40774077

40784078
exports[`test/basic.js > TAP > basic tests > makeRe a***c 1`] = `
4079-
/^a[^/]*?[^/]*?[^/]*?c$/
4079+
/^a[^/]*?c$/
40804080
`
40814081

40824082
exports[`test/basic.js > TAP > basic tests > makeRe a*cd**?**??k 1`] = `
4083-
/^a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k$/
4083+
/^a[^/]*?cd[^/]*?[^/][^/]*?[^/][^/]k$/
40844084
`
40854085

40864086
exports[`test/basic.js > TAP > basic tests > makeRe a/.*/b 1`] = `

tap-snapshots/test/escape-has-magic.js.test.cjs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ exports[`test/escape-has-magic.js > TAP > ??**********?****? 1`] = `
163163
Array [
164164
Array [
165165
Array [
166-
/^(?!\\.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]$/,
166+
/^(?!\\.)[^/][^/][^/]*?[^/][^/]*?[^/]$/,
167167
],
168168
],
169169
true,
@@ -174,7 +174,7 @@ exports[`test/escape-has-magic.js > TAP > ??**********?****c 1`] = `
174174
Array [
175175
Array [
176176
Array [
177-
/^(?!\\.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c$/,
177+
/^(?!\\.)[^/][^/][^/]*?[^/][^/]*?c$/,
178178
],
179179
],
180180
true,
@@ -251,7 +251,7 @@ exports[`test/escape-has-magic.js > TAP > ?***?**** 1`] = `
251251
Array [
252252
Array [
253253
Array [
254-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?$/,
254+
/^(?!\\.)[^/][^/]*?[^/][^/]*?$/,
255255
],
256256
],
257257
true,
@@ -262,7 +262,7 @@ exports[`test/escape-has-magic.js > TAP > ?***?****? 1`] = `
262262
Array [
263263
Array [
264264
Array [
265-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]$/,
265+
/^(?!\\.)[^/][^/]*?[^/][^/]*?[^/]$/,
266266
],
267267
],
268268
true,
@@ -273,7 +273,7 @@ exports[`test/escape-has-magic.js > TAP > ?***?****c 1`] = `
273273
Array [
274274
Array [
275275
Array [
276-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c$/,
276+
/^(?!\\.)[^/][^/]*?[^/][^/]*?c$/,
277277
],
278278
],
279279
true,
@@ -284,7 +284,7 @@ exports[`test/escape-has-magic.js > TAP > ?*****?? 1`] = `
284284
Array [
285285
Array [
286286
Array [
287-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]$/,
287+
/^(?!\\.)[^/][^/]*?[^/][^/]$/,
288288
],
289289
],
290290
true,
@@ -295,7 +295,7 @@ exports[`test/escape-has-magic.js > TAP > ?*****?c 1`] = `
295295
Array [
296296
Array [
297297
Array [
298-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c$/,
298+
/^(?!\\.)[^/][^/]*?[^/]c$/,
299299
],
300300
],
301301
true,
@@ -306,7 +306,7 @@ exports[`test/escape-has-magic.js > TAP > ?************c****?**** 1`] = `
306306
Array [
307307
Array [
308308
Array [
309-
/^(?!\\.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?$/,
309+
/^(?!\\.)[^/][^/]*?c[^/]*?[^/][^/]*?$/,
310310
],
311311
],
312312
true,
@@ -1388,7 +1388,7 @@ exports[`test/escape-has-magic.js > TAP > *****?? 1`] = `
13881388
Array [
13891389
Array [
13901390
Array [
1391-
/^(?!\\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]$/,
1391+
/^(?!\\.)[^/]*?[^/][^/]$/,
13921392
],
13931393
],
13941394
true,
@@ -1399,7 +1399,7 @@ exports[`test/escape-has-magic.js > TAP > *******? 1`] = `
13991399
Array [
14001400
Array [
14011401
Array [
1402-
/^(?!\\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]$/,
1402+
/^(?!\\.)[^/]*?[^/]$/,
14031403
],
14041404
],
14051405
true,
@@ -1410,7 +1410,7 @@ exports[`test/escape-has-magic.js > TAP > *******c 1`] = `
14101410
Array [
14111411
Array [
14121412
Array [
1413-
/^(?!\\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c$/,
1413+
/^(?!\\.)[^/]*?c$/,
14141414
],
14151415
],
14161416
true,
@@ -1493,7 +1493,7 @@ exports[`test/escape-has-magic.js > TAP > *c*?** 1`] = `
14931493
Array [
14941494
Array [
14951495
Array [
1496-
/^(?!\\.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?$/,
1496+
/^(?!\\.)[^/]*?c[^/]*?[^/][^/]*?$/,
14971497
],
14981498
],
14991499
true,
@@ -1897,7 +1897,7 @@ exports[`test/escape-has-magic.js > TAP > a**?**cd**?**??***k 1`] = `
18971897
Array [
18981898
Array [
18991899
Array [
1900-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k$/,
1900+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/][^/]*?k$/,
19011901
],
19021902
],
19031903
true,
@@ -1908,7 +1908,7 @@ exports[`test/escape-has-magic.js > TAP > a**?**cd**?**??***k** 1`] = `
19081908
Array [
19091909
Array [
19101910
Array [
1911-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?$/,
1911+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/][^/]*?k[^/]*?$/,
19121912
],
19131913
],
19141914
true,
@@ -1919,7 +1919,7 @@ exports[`test/escape-has-magic.js > TAP > a**?**cd**?**??k 1`] = `
19191919
Array [
19201920
Array [
19211921
Array [
1922-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k$/,
1922+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/]k$/,
19231923
],
19241924
],
19251925
true,
@@ -1930,7 +1930,7 @@ exports[`test/escape-has-magic.js > TAP > a**?**cd**?**??k*** 1`] = `
19301930
Array [
19311931
Array [
19321932
Array [
1933-
/^a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?$/,
1933+
/^a[^/]*?[^/][^/]*?cd[^/]*?[^/][^/]*?[^/][^/]k[^/]*?$/,
19341934
],
19351935
],
19361936
true,
@@ -1941,7 +1941,7 @@ exports[`test/escape-has-magic.js > TAP > a*****?c 1`] = `
19411941
Array [
19421942
Array [
19431943
Array [
1944-
/^a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c$/,
1944+
/^a[^/]*?[^/]c$/,
19451945
],
19461946
],
19471947
true,
@@ -1952,7 +1952,7 @@ exports[`test/escape-has-magic.js > TAP > a********???******* 1`] = `
19521952
Array [
19531953
Array [
19541954
Array [
1955-
/^a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?$/,
1955+
/^a[^/]*?[^/][^/][^/][^/]*?$/,
19561956
],
19571957
],
19581958
true,
@@ -1963,7 +1963,7 @@ exports[`test/escape-has-magic.js > TAP > a*****c*?** 1`] = `
19631963
Array [
19641964
Array [
19651965
Array [
1966-
/^a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?$/,
1966+
/^a[^/]*?c[^/]*?[^/][^/]*?$/,
19671967
],
19681968
],
19691969
true,
@@ -1974,7 +1974,7 @@ exports[`test/escape-has-magic.js > TAP > a****c**?**??***** 1`] = `
19741974
Array [
19751975
Array [
19761976
Array [
1977-
/^a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?$/,
1977+
/^a[^/]*?c[^/]*?[^/][^/]*?[^/][^/][^/]*?$/,
19781978
],
19791979
],
19801980
true,
@@ -1985,7 +1985,7 @@ exports[`test/escape-has-magic.js > TAP > a***c 1`] = `
19851985
Array [
19861986
Array [
19871987
Array [
1988-
/^a[^/]*?[^/]*?[^/]*?c$/,
1988+
/^a[^/]*?c$/,
19891989
],
19901990
],
19911991
true,
@@ -1996,7 +1996,7 @@ exports[`test/escape-has-magic.js > TAP > a*cd**?**??k 1`] = `
19961996
Array [
19971997
Array [
19981998
Array [
1999-
/^a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k$/,
1999+
/^a[^/]*?cd[^/]*?[^/][^/]*?[^/][^/]k$/,
20002000
],
20012001
],
20022002
true,

0 commit comments

Comments
 (0)