@@ -120,6 +120,22 @@ function charFromCodepoint(c) {
120120 ) ;
121121}
122122
123+ // set a property of a literal object, while protecting against prototype pollution,
124+ // see https://github.com/nodeca/js-yaml/issues/164 for more details
125+ function setProperty ( object , key , value ) {
126+ // used for this specific key only because Object.defineProperty is slow
127+ if ( key === '__proto__' ) {
128+ Object . defineProperty ( object , key , {
129+ configurable : true ,
130+ enumerable : true ,
131+ writable : true ,
132+ value,
133+ } ) ;
134+ } else {
135+ object [ key ] = value ;
136+ }
137+ }
138+
123139var simpleEscapeCheck = new Array ( 256 ) ; // integer, for fast access
124140var simpleEscapeMap = new Array ( 256 ) ;
125141for ( var i = 0 ; i < 256 ; i ++ ) {
@@ -298,7 +314,7 @@ function mergeMappings(state, destination, source, overridableKeys) {
298314 key = sourceKeys [ index ] ;
299315
300316 if ( ! _hasOwnProperty . call ( destination , key ) ) {
301- destination [ key ] = source [ key ] ;
317+ setProperty ( destination , key , source [ key ] ) ;
302318 overridableKeys [ key ] = true ;
303319 }
304320 }
@@ -358,17 +374,7 @@ function storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valu
358374 throwError ( state , 'duplicated mapping key' ) ;
359375 }
360376
361- // used for this specific key only because Object.defineProperty is slow
362- if ( keyNode === '__proto__' ) {
363- Object . defineProperty ( _result , keyNode , {
364- configurable : true ,
365- enumerable : true ,
366- writable : true ,
367- value : valueNode
368- } ) ;
369- } else {
370- _result [ keyNode ] = valueNode ;
371- }
377+ setProperty ( _result , keyNode , valueNode ) ;
372378 delete overridableKeys [ keyNode ] ;
373379 }
374380
0 commit comments