@@ -56,6 +56,13 @@ function getOptions(options, defaultOptions) {
56
56
return options ;
57
57
}
58
58
59
+ function copyObject ( source , target ) {
60
+ target = arguments . length >= 2 ? target : { } ;
61
+ for ( const key in source )
62
+ target [ key ] = source [ key ] ;
63
+ return target ;
64
+ }
65
+
59
66
function rethrow ( ) {
60
67
// TODO(thefourtheye) Throw error instead of warning in major version > 7
61
68
process . emitWarning (
@@ -1230,11 +1237,11 @@ fs.appendFile = function(path, data, options, callback) {
1230
1237
callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
1231
1238
options = getOptions ( options , { encoding : 'utf8' , mode : 0o666 , flag : 'a' } ) ;
1232
1239
1233
- if ( ! options . flag )
1234
- options = util . _extend ( { flag : 'a' } , options ) ;
1240
+ // Don't make changes directly on options object
1241
+ options = copyObject ( options ) ;
1235
1242
1236
1243
// force append behavior when using a supplied file descriptor
1237
- if ( isFd ( path ) )
1244
+ if ( ! options . flag || isFd ( path ) )
1238
1245
options . flag = 'a' ;
1239
1246
1240
1247
fs . writeFile ( path , data , options , callback ) ;
@@ -1243,11 +1250,11 @@ fs.appendFile = function(path, data, options, callback) {
1243
1250
fs . appendFileSync = function ( path , data , options ) {
1244
1251
options = getOptions ( options , { encoding : 'utf8' , mode : 0o666 , flag : 'a' } ) ;
1245
1252
1246
- if ( ! options . flag )
1247
- options = util . _extend ( { flag : 'a' } , options ) ;
1253
+ // Don't make changes directly on options object
1254
+ options = copyObject ( options ) ;
1248
1255
1249
1256
// force append behavior when using a supplied file descriptor
1250
- if ( isFd ( path ) )
1257
+ if ( ! options . flag || isFd ( path ) )
1251
1258
options . flag = 'a' ;
1252
1259
1253
1260
fs . writeFileSync ( path , data , options ) ;
@@ -1305,6 +1312,9 @@ fs.watch = function(filename, options, listener) {
1305
1312
}
1306
1313
options = getOptions ( options , { } ) ;
1307
1314
1315
+ // Don't make changes directly on options object
1316
+ options = copyObject ( options ) ;
1317
+
1308
1318
if ( options . persistent === undefined ) options . persistent = true ;
1309
1319
if ( options . recursive === undefined ) options . recursive = false ;
1310
1320
@@ -1705,7 +1715,7 @@ function ReadStream(path, options) {
1705
1715
return new ReadStream ( path , options ) ;
1706
1716
1707
1717
// a little bit bigger buffer and water marks by default
1708
- options = Object . create ( getOptions ( options , { } ) ) ;
1718
+ options = copyObject ( getOptions ( options , { } ) ) ;
1709
1719
if ( options . highWaterMark === undefined )
1710
1720
options . highWaterMark = 64 * 1024 ;
1711
1721
@@ -1871,7 +1881,7 @@ function WriteStream(path, options) {
1871
1881
if ( ! ( this instanceof WriteStream ) )
1872
1882
return new WriteStream ( path , options ) ;
1873
1883
1874
- options = Object . create ( getOptions ( options , { } ) ) ;
1884
+ options = copyObject ( getOptions ( options , { } ) ) ;
1875
1885
1876
1886
Writable . call ( this , options ) ;
1877
1887
0 commit comments