diff --git a/packages/utils/src/path.ts b/packages/utils/src/path.ts index 16534a7ef358..7a65aa57b7c8 100644 --- a/packages/utils/src/path.ts +++ b/packages/utils/src/path.ts @@ -51,10 +51,13 @@ function normalizeArray(parts: string[], allowAboveRoot?: boolean): string[] { // Split a filename into [root, dir, basename, ext], unix version // 'root' is just a slash, or nothing. -const splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^/]+?|)(\.[^./]*|))(?:[/]*)$/; +const splitPathRe = /^(\S+:\\|\/?)([\s\S]*?)((?:\.{1,2}|[^/\\]+?|)(\.[^./\\]*|))(?:[/\\]*)$/; /** JSDoc */ function splitPath(filename: string): string[] { - const parts = splitPathRe.exec(filename); + // Truncate files names greater than 1024 characters to avoid regex dos + // https://github.com/getsentry/sentry-javascript/pull/8737#discussion_r1285719172 + const truncated = filename.length > 1024 ? `${filename.slice(-1024)}` : filename; + const parts = splitPathRe.exec(truncated); return parts ? parts.slice(1) : []; } diff --git a/packages/utils/test/path.test.ts b/packages/utils/test/path.test.ts new file mode 100644 index 000000000000..3ba750830f1b --- /dev/null +++ b/packages/utils/test/path.test.ts @@ -0,0 +1,33 @@ +import { basename, dirname } from '../src/path'; + +describe('path', () => { + describe('basename', () => { + test('unix', () => { + expect(basename('/foo/bar/baz/asdf/quux.html')).toEqual('quux.html'); + expect(basename('foo/bar/baz/asdf/quux.html')).toEqual('quux.html'); + expect(basename('../baz/asdf/quux.html')).toEqual('quux.html'); + expect(basename('quux.html')).toEqual('quux.html'); + }); + test('windows', () => { + expect(basename('c:\\foo\\bar\\baz\\asdf\\quux.html')).toEqual('quux.html'); + expect(basename('\\foo\\bar\\baz\\asdf\\quux.html')).toEqual('quux.html'); + expect(basename('..\\bar\\baz\\asdf\\quux.html')).toEqual('quux.html'); + expect(basename('quux.html')).toEqual('quux.html'); + }); + }); + + describe('dirname', () => { + test('unix', () => { + expect(dirname('/foo/bar/baz/asdf/quux.html')).toEqual('/foo/bar/baz/asdf'); + expect(dirname('foo/bar/baz/asdf/quux.html')).toEqual('foo/bar/baz/asdf'); + expect(dirname('../baz/asdf/quux.html')).toEqual('../baz/asdf'); + expect(dirname('/quux.html')).toEqual('/'); + }); + test('windows', () => { + expect(dirname('C:\\foo\\bar\\baz\\asdf\\quux.html')).toEqual('C:\\foo\\bar\\baz\\asdf'); + expect(dirname('\\foo\\bar\\baz\\asdf\\quux.html')).toEqual('\\foo\\bar\\baz\\asdf'); + expect(dirname('..\\bar\\baz\\asdf\\quux.html')).toEqual('..\\bar\\baz\\asdf'); + expect(dirname('quux.html')).toEqual('.'); + }); + }); +});