Skip to content

Maximum call stack size exceeded #881

Description

@wxfred

Please try the simple options below,

options: {
  identifierNamesGenerator: 'mangled-shuffled',
  reservedNames: ['.*'],
}

Obfuscator version used: 2.9.4

Stack trace

RangeError: Maximum call stack size exceeded
RangeError: Maximum call stack size exceeded
    at o.isValidIdentifierName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:87:5)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:126:19)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledShuffledIdentifierNamesGenerator.ts:46:22)
    at o.generateNewMangledName (G:\XXX\node_modules\javascript-obfuscator\dist\webpack:\javascript-obfuscator\src\generators\identifier-names-generators\MangledIdentifierNamesGenerator.ts:127:35)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] build: `vue-cli-service build`
npm ERR! Exit status 1

In src/generators/identifier-names-generators/MangledIdentifierNamesGenerators.ts line 231, function isValidIdentifierName (which is in src/generators/identifier-names-generators/AbstractIdentifierNamesGenerators.ts) excludes new mangled names that are matched with reservedNames. I think that's the problem.

// src/generators/identifier-names-generators/MangledIdentifierNamesGenerators.ts
protected generateNewMangledName (previousMangledName: string): string {
  ...
  if (!this.isValidIdentifierName(newMangledName)) {
    newMangledName = this.generateNewMangledName(newMangledName);
  }

  return newMangledName;
}

// src/generators/identifier-names-generators/AbstractIdentifierNamesGenerators.ts
public isValidIdentifierName (name: string): boolean {
  return this.notReservedName(name) && !this.preservedNamesSet.has(name);
}

private notReservedName (name: string): boolean {
  return this.options.reservedNames.length
    ? !this.options.reservedNames.some((reservedName: string) =>
      new RegExp(reservedName, 'g').exec(name) !== null
    )
    : true;
}

In the document, reservedNames means something should not be obfuscated, in my case, .* means everything, then when you generate mangled names, you use reservedNames again for excluding, every mangled name will be excluded, it causes the dead loop.

Activity

  1. da411d commented on Feb 20, 2021

    @da411d
    Contributor

    I faced same issue when used regex in reservedNames.
    But i used something like "\\$\\$" as i remember

  2. Androbin commented on Jun 12, 2021

    @Androbin

    I am facing the same issue with default settings and this input:

    class Foo {
        foo;
    }
  3. sanex3339 commented on Jun 12, 2021

    @sanex3339
    Member

    @Androbin this is absolutely different thing. Class properties support will be added within this PR:
    #916

    Issue: #909

  4. gevinduM commented on Jul 21, 2021

    @gevinduM

    I am facing the same issue with default settings and this input:

    class Foo {
        foo;
    }

    were you able to solve this ?

  5. sanex3339 commented on Jul 21, 2021

    @sanex3339
    Member

    Hi. We have to wait until eslint/eslint-scope#71 will be merged

  6. regnaio commented on Jul 21, 2021

    @regnaio

    @sanex3339 Sorry to bother, and thank you for all of your time and help. I was curious about the following:

    I cloned your repo locally, merged #916 with master, upgraded typescript to 4.4.0-beta, and rebuilt index.browser.js with npm run build

    (I also had to add globalObject: 'this' to module.exports.output in webpack.browser.js due to running into the error: https://stackoverflow.com/questions/64639839/typescript-webpack-library-generates-referenceerror-self-is-not-defined)

    I then tried obfuscating a JS file with classes with properties, and still ran into RangeError: Maximum call stack size exceeded. I removed the class properties and the obfuscation ran successfully.

    Would you expect obfuscation to fail (for class properties) even with my local attempt to merge #916 with master?

    Thank you, sanex3339!

  7. sanex3339 commented on Jul 21, 2021

    @sanex3339
    Member

    Please wait until the official support. Even after eslint/eslint-scope#71 i will update #916 branch.

  8. gevinduM commented on Jul 22, 2021

    @gevinduM

    Please wait until the official support. Even after eslint/eslint-scope#71 i will update #916 branch.

    will this fix Class properties support as well?

  9. sanex3339 commented on Jul 22, 2021

    @sanex3339
    Member

    With the next eslint-scope release i will continue to add class properties support to the obfuscator

  10. gevinduM commented on Jul 22, 2021

    @gevinduM

    eslint/eslint-scope#71

    its merged ✌️

  11. sanex3339 commented on Jul 22, 2021

    @sanex3339
    Member

    Yes. But the release date of eslint-scope is still unknown.

  12. Androbin commented on Jul 23, 2021

    @Androbin
  13. regnaio commented on Jul 23, 2021

    @regnaio

    Just tried out sanex3339's merge of #916! Seems to work perfectly for classes 😄

  14. qozle commented on Aug 24, 2022

    @qozle

    Has this been fixed for the initial regex problem that this issue was opened for? I'm getting RangeError: Maximum call stack size exceeded when using the grunt obfuscator plugin. Here's my JS:

    $(async () => {
    
    	var d = new $.Deferred();
    
    	$.ajax({
    		url: "/customers",
    		method: "GET",
    		headers: {
    			"App-Source": "FLEX DB Web Reader"
    		},
    		success: (res) => {
    			console.log("We got a response: ", res);
    			d.resolve(res);
    		},
    		error: (err) => {
    			d.reject(err);
    		}
    	});
    
    	var rawData = await d;
    	
    	$("#gridContainer").dxDataGrid({
    		dataSource: rawData,
    		loadMode: "raw",
    		sorting: { mode: "single" },
    		filterRow: { visible: true },
    		searchPanel: {
    			visible: true,
    			highlightCaseSensitive: true,
    		},
    		groupPanel: { visible: true },
    		paging: { pageSize: 10 },
    		pager: {
    			showPageSizeSelector: true,
    			allowedPageSizes: [10, 25, 50, 100],
    		},
    		allowColumnReordering: true,
    		rowAlternationEnabled: true,
    		showBorders: true,
    		columns: [
    			{
    				dataField: "name",
    				caption: "Customer Name",
    			},
    			{
    				dataField: "addr1",
    				caption: "Address Line 1",
    			},
    			{
    				dataField: "addr2",
    				caption: "Address Line 2",
    			},
    			{
    				dataField: "city",
    				caption: "City",
    			},
    			{
    				dataField: "state",
    				caption: "State",
    			},
    			{
    				dataField: "zip",
    				caption: "Postal / Zip code",
    			},
    			{
    				dataField: "country",
    				caption: "Country",
    			},
    			{
    				dataField: "phone",
    				caption: "Phone",
    			},
    			{
    				dataField: "email",
    				caption: "E-mail",
    			}
    		],
    	});
    });
    

    And I'm using these options:

    options: {
        renamePropertiesMode: 'safe',
        selfDefend: false,
        reservedNames: ["\$.*"],
        reservedStrings: ["\$\."]
    }
    

    This is part of a different issue- when I use the default options, the code won't run because I get this error:

    Uncaught TypeError: $[_0x283738(...)] is not a function
    

    Which is pointing to here:

     $(async()=>{
                    var _0x283738 = _0x5a53
                      , _0x586abb = new $[(_0x283738(0x194))]();
                    $[_0x283738(0x18f)]({  //  this line here is where the error is raised from
                        'url': _0x283738(0x192),
                        'method': _0x283738(0x17f),
                        'headers': {
                            'App-Source': _0x283738(0x197)
    ... et c
    
  15. sanex3339 commented on Mar 22, 2026

    @sanex3339
    Member

    Will be fixed in 5.4.0 later today

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions