Skip to content

Fix json-related scriptlets — infinite loop in 'getRecursiveCandidates' #563

@AdamWr

Description

@AdamWr

Steps to reproduce:

  1. Add to user rules:
example.org#%#//scriptlet('trusted-json-set', 'Object.keys', '$..[data.ad]', '$remove$', '', 'arg')
  1. Navigate to - https://example.org/
  2. Run in console:
const obj = { a: 1 };
obj.self = obj;
Object.keys(obj)

Website is unresponsive.
It looks like that stuck in the loop in:

function getRecursiveCandidates(candidate: JsonPathCandidate): JsonPathCandidate[] {

Probably changing it to something like:

function getRecursiveCandidates(candidate: JsonPathCandidate): JsonPathCandidate[] {
        const output: JsonPathCandidate[] = [candidate];
        const visitedObjects = new WeakSet<object>();
        if (isObjectLike(candidate.value)) {
            visitedObjects.add(candidate.value);
        }

        const initialChildren = getChildCandidates(candidate);
        for (let i = 0; i < initialChildren.length; i += 1) {
            if (isObjectLike(initialChildren[i].value)) {
                if (visitedObjects.has(initialChildren[i].value)) {
                    continue;
                }
                visitedObjects.add(initialChildren[i].value);
            }
            output.push(initialChildren[i]);
        }

        let head = 1;
        while (head < output.length) {
            const childCandidates = getChildCandidates(output[head]);
            for (let i = 0; i < childCandidates.length; i += 1) {
                if (isObjectLike(childCandidates[i].value)) {
                    if (visitedObjects.has(childCandidates[i].value)) {
                        continue;
                    }
                    visitedObjects.add(childCandidates[i].value);
                }
                output.push(childCandidates[i]);
            }
            head += 1;
        }

        return output;
    }

should fixes it.

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions