@@ -4589,6 +4589,22 @@ function charFromCodepoint(c) {
45894589 ) ;
45904590}
45914591
4592+ // set a property of a literal object, while protecting against prototype pollution,
4593+ // see https://github.com/nodeca/js-yaml/issues/164 for more details
4594+ function setProperty ( object , key , value ) {
4595+ // used for this specific key only because Object.defineProperty is slow
4596+ if ( key === '__proto__' ) {
4597+ Object . defineProperty ( object , key , {
4598+ configurable : true ,
4599+ enumerable : true ,
4600+ writable : true ,
4601+ value : value
4602+ } ) ;
4603+ } else {
4604+ object [ key ] = value ;
4605+ }
4606+ }
4607+
45924608var simpleEscapeCheck = new Array ( 256 ) ; // integer, for fast access
45934609var simpleEscapeMap = new Array ( 256 ) ;
45944610for ( var i = 0 ; i < 256 ; i ++ ) {
@@ -4767,7 +4783,7 @@ function mergeMappings(state, destination, source, overridableKeys) {
47674783 key = sourceKeys [ index ] ;
47684784
47694785 if ( ! _hasOwnProperty . call ( destination , key ) ) {
4770- destination [ key ] = source [ key ] ;
4786+ setProperty ( destination , key , source [ key ] ) ;
47714787 overridableKeys [ key ] = true ;
47724788 }
47734789 }
@@ -4827,17 +4843,7 @@ function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valu
48274843 throwError ( state , 'duplicated mapping key' ) ;
48284844 }
48294845
4830- // used for this specific key only because Object.defineProperty is slow
4831- if ( keyNode === '__proto__' ) {
4832- Object . defineProperty ( _result , keyNode , {
4833- configurable : true ,
4834- enumerable : true ,
4835- writable : true ,
4836- value : valueNode
4837- } ) ;
4838- } else {
4839- _result [ keyNode ] = valueNode ;
4840- }
4846+ setProperty ( _result , keyNode , valueNode ) ;
48414847 delete overridableKeys [ keyNode ] ;
48424848 }
48434849
0 commit comments