@@ -121,6 +121,22 @@ function charFromCodepoint(c) {
121121 ) ;
122122}
123123
124+ // set a property of a literal object, while protecting against prototype pollution,
125+ // see https://github.com/nodeca/js-yaml/issues/164 for more details
126+ function setProperty ( object , key , value ) {
127+ // used for this specific key only because Object.defineProperty is slow
128+ if ( key === '__proto__' ) {
129+ Object . defineProperty ( object , key , {
130+ configurable : true ,
131+ enumerable : true ,
132+ writable : true ,
133+ value : value
134+ } ) ;
135+ } else {
136+ object [ key ] = value ;
137+ }
138+ }
139+
124140var simpleEscapeCheck = new Array ( 256 ) ; // integer, for fast access
125141var simpleEscapeMap = new Array ( 256 ) ;
126142for ( var i = 0 ; i < 256 ; i ++ ) {
@@ -278,7 +294,7 @@ function mergeMappings(state, destination, source, overridableKeys) {
278294 key = sourceKeys [ index ] ;
279295
280296 if ( ! _hasOwnProperty . call ( destination , key ) ) {
281- destination [ key ] = source [ key ] ;
297+ setProperty ( destination , key , source [ key ] ) ;
282298 overridableKeys [ key ] = true ;
283299 }
284300 }
@@ -334,7 +350,7 @@ function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valu
334350 state . position = startPos || state . position ;
335351 throwError ( state , 'duplicated mapping key' ) ;
336352 }
337- _result [ keyNode ] = valueNode ;
353+ setProperty ( _result , keyNode , valueNode ) ;
338354 delete overridableKeys [ keyNode ] ;
339355 }
340356
0 commit comments