Skip to content

Commit 9d4de14

Browse files
ibesoragithub-actions[bot]
authored andcommitted
Fix crash when using style expressions with prototype-derived
GitOrigin-RevId: 3578c6e0678dc9b7935925d95671fb1ccab804fe
1 parent 58f88de commit 9d4de14

2 files changed

Lines changed: 12 additions & 4 deletions

File tree

src/style-spec/expression/scope.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ import type {Expression} from './expression';
66
*/
77
class Scope {
88
parent: Scope | null | undefined;
9-
bindings: {
10-
[_: string]: Expression;
11-
};
9+
bindings: Record<string, Expression>;
1210
constructor(parent?: Scope, bindings: Array<[string, Expression]> = []) {
1311
this.parent = parent;
14-
this.bindings = {};
12+
this.bindings = Object.create(null) as Record<string, Expression>;
1513
for (const [name, expression] of bindings) {
1614
this.bindings[name] = expression;
1715
}

test/unit/style-spec/expression.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ describe('createExpression treats inherited Object.prototype member names as unk
5454
});
5555
});
5656

57+
describe('createExpression treats inherited Object.prototype member names as unbound "var" names', () => {
58+
test.each(['__proto__', 'constructor', 'toString', 'hasOwnProperty', 'valueOf'])('%s', (name) => {
59+
expect(() => createExpression(['var', name])).not.toThrow();
60+
const {result, value} = createExpression(['var', name]);
61+
expect(result).toEqual('error');
62+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
63+
expect(value[0].message).toMatch(`Unknown variable "${name}"`);
64+
});
65+
});
66+
5767
describe('validateExpression', () => {
5868
//see https://github.com/mapbox/mapbox-gl-js/issues/11457
5969
test('ensure lack of valueSpec does not cause uncaught error', () => {

0 commit comments

Comments
 (0)