diff --git a/docs/src/modules/components/Demo.js b/docs/src/modules/components/Demo.js index 9db296fe554381..53e688b3a9f7af 100644 --- a/docs/src/modules/components/Demo.js +++ b/docs/src/modules/components/Demo.js @@ -473,7 +473,9 @@ export default function Demo(props) { `The following demos use TS directly: ${demoOptions.demo}.`, '', 'Please run "pnpm docs:typescript:formatted" to generate a JS version and reference it:', - `{{"demo": "${demoOptions.demo.replace(/\.(.*)$/, '.js')}", …}}.`, + // This regex intentionally excludes the dot character in the Kleene star to prevent ReDoS + // See /~https://github.com/mui/material-ui/issues/44078 + `{{"demo": "${demoOptions.demo.replace(/\.([^.]*)$/, '.js')}", …}}.`, '', "Otherwise, if it's not a code demo hide the toolbar:", `{{"demo": "${demoOptions.demo}", "hideToolbar": true, …}}.`, diff --git a/packages/markdown/parseMarkdown.js b/packages/markdown/parseMarkdown.js index 3cf7e3f96c7a92..72dcd6ba1bc5a4 100644 --- a/packages/markdown/parseMarkdown.js +++ b/packages/markdown/parseMarkdown.js @@ -209,7 +209,11 @@ function getCodeblock(content) { if (!content.startsWith(']*storageKey=["|'](\S*)["|'].*>/m)?.[1]; + // The regexes below have a negative lookahead to prevent ReDoS + // See /~https://github.com/mui/material-ui/issues/44078 + const storageKey = content.match( + /^]*storageKey=["|'](?!storageKey=["|'])(\S*)["|'].*>/m, + )?.[1]; const blocks = [...content.matchAll(/^```(\S*) (\S*)\n(.*?)\n```/gmsu)].map( ([, language, tab, code]) => ({ language, tab, code }), ); diff --git a/packages/mui-codemod/src/v5.0.0/root-ref.js b/packages/mui-codemod/src/v5.0.0/root-ref.js index 3af9291ed1d174..bc09b2c99ace95 100644 --- a/packages/mui-codemod/src/v5.0.0/root-ref.js +++ b/packages/mui-codemod/src/v5.0.0/root-ref.js @@ -2,10 +2,12 @@ * @param {import('jscodeshift').FileInfo} file */ export default function transformer(file) { + // The regexes below have a negative lookahead to prevent ReDoS + // See /~https://github.com/mui/material-ui/issues/44078 return file.source - .replace(/\n?import.*core\/RootRef['"];?/gm, '') + .replace(/\n?import(?!import).*core\/RootRef['"];?/gm, '') .replace(/\n?import {\s?RootRef\s?} from ['"]@material-ui\/core\/?['"];?/gm, '') .replace(/({.*)(RootRef,?)(.*})/gm, '$1$3') - .replace(//gm, '<>') + .replace(//gm, '<>') .replace(/<\/RootRef>/gm, ''); }