@@ -29,21 +29,31 @@ var promiseWarning;
29
29
30
30
31
31
function ensureSafeMemberName ( name , fullExpression ) {
32
+ if ( name === "__defineGetter__" || name === "__defineSetter__"
33
+ || name === "__lookupGetter__" || name === "__lookupSetter__"
34
+ || name === "__proto__" ) {
35
+ throw $parseMinErr ( 'isecfld' ,
36
+ 'Attempting to access a disallowed field in Angular expressions! '
37
+ + 'Expression: {0}' , fullExpression ) ;
38
+ }
39
+ return name ;
40
+ }
41
+
42
+ function getStringValue ( name , fullExpression ) {
32
43
// From the JavaScript docs:
33
44
// Property names must be strings. This means that non-string objects cannot be used
34
45
// as keys in an object. Any non-string object, including a number, is typecasted
35
46
// into a string via the toString method.
36
47
//
37
48
// So, to ensure that we are checking the same `name` that JavaScript would use,
38
- // we cast it to a string, if possible
39
- name = ( isObject ( name ) && name . toString ) ? name . toString ( ) : name ;
40
-
41
- if ( name === "__defineGetter__" || name === "__defineSetter__"
42
- || name === "__lookupGetter__" || name === "__lookupSetter__"
43
- || name === "__proto__" ) {
44
- throw $parseMinErr ( 'isecfld' ,
45
- 'Attempting to access a disallowed field in Angular expressions! '
46
- + 'Expression: {0}' , fullExpression ) ;
49
+ // we cast it to a string, if possible.
50
+ // Doing `name + ''` can cause a repl error if the result to `toString` is not a string,
51
+ // this is, this will handle objects that misbehave.
52
+ name = name + '' ;
53
+ if ( ! isString ( name ) ) {
54
+ throw $parseMinErr ( 'iseccst' ,
55
+ 'Cannot convert object to primitive value! '
56
+ + 'Expression: {0}' , fullExpression ) ;
47
57
}
48
58
return name ;
49
59
}
@@ -722,7 +732,7 @@ Parser.prototype = {
722
732
723
733
return extend ( function ( self , locals ) {
724
734
var o = obj ( self , locals ) ,
725
- i = indexFn ( self , locals ) ,
735
+ i = getStringValue ( indexFn ( self , locals ) , parser . text ) ,
726
736
v , p ;
727
737
728
738
ensureSafeMemberName ( i , parser . text ) ;
@@ -739,7 +749,7 @@ Parser.prototype = {
739
749
return v ;
740
750
} , {
741
751
assign : function ( self , value , locals ) {
742
- var key = ensureSafeMemberName ( indexFn ( self , locals ) , parser . text ) ;
752
+ var key = ensureSafeMemberName ( getStringValue ( indexFn ( self , locals ) , parser . text ) , parser . text ) ;
743
753
// prevent overwriting of Function.constructor which would break ensureSafeObject check
744
754
var o = ensureSafeObject ( obj ( self , locals ) , parser . text ) ;
745
755
if ( ! o ) obj . assign ( self , o = { } ) ;
0 commit comments