@@ -64,6 +64,13 @@ function getOptions(options, defaultOptions) {
64
64
return options ;
65
65
}
66
66
67
+ function copyObject ( source , target ) {
68
+ target = arguments . length >= 2 ? target : { } ;
69
+ for ( const key in source )
70
+ target [ key ] = source [ key ] ;
71
+ return target ;
72
+ }
73
+
67
74
function rethrow ( ) {
68
75
// TODO(thefourtheye) Throw error instead of warning in major version > 7
69
76
process . emitWarning (
@@ -1280,11 +1287,11 @@ fs.appendFile = function(path, data, options, callback) {
1280
1287
callback = maybeCallback ( arguments [ arguments . length - 1 ] ) ;
1281
1288
options = getOptions ( options , { encoding : 'utf8' , mode : 0o666 , flag : 'a' } ) ;
1282
1289
1283
- if ( ! options . flag )
1284
- options = util . _extend ( { flag : 'a' } , options ) ;
1290
+ // Don't make changes directly on options object
1291
+ options = copyObject ( options ) ;
1285
1292
1286
1293
// force append behavior when using a supplied file descriptor
1287
- if ( isFd ( path ) )
1294
+ if ( ! options . flag || isFd ( path ) )
1288
1295
options . flag = 'a' ;
1289
1296
1290
1297
fs . writeFile ( path , data , options , callback ) ;
@@ -1293,11 +1300,11 @@ fs.appendFile = function(path, data, options, callback) {
1293
1300
fs . appendFileSync = function ( path , data , options ) {
1294
1301
options = getOptions ( options , { encoding : 'utf8' , mode : 0o666 , flag : 'a' } ) ;
1295
1302
1296
- if ( ! options . flag )
1297
- options = util . _extend ( { flag : 'a' } , options ) ;
1303
+ // Don't make changes directly on options object
1304
+ options = copyObject ( options ) ;
1298
1305
1299
1306
// force append behavior when using a supplied file descriptor
1300
- if ( isFd ( path ) )
1307
+ if ( ! options . flag || isFd ( path ) )
1301
1308
options . flag = 'a' ;
1302
1309
1303
1310
fs . writeFileSync ( path , data , options ) ;
@@ -1355,6 +1362,9 @@ fs.watch = function(filename, options, listener) {
1355
1362
}
1356
1363
options = getOptions ( options , { } ) ;
1357
1364
1365
+ // Don't make changes directly on options object
1366
+ options = copyObject ( options ) ;
1367
+
1358
1368
if ( options . persistent === undefined ) options . persistent = true ;
1359
1369
if ( options . recursive === undefined ) options . recursive = false ;
1360
1370
@@ -1755,7 +1765,7 @@ function ReadStream(path, options) {
1755
1765
return new ReadStream ( path , options ) ;
1756
1766
1757
1767
// a little bit bigger buffer and water marks by default
1758
- options = Object . create ( getOptions ( options , { } ) ) ;
1768
+ options = copyObject ( getOptions ( options , { } ) ) ;
1759
1769
if ( options . highWaterMark === undefined )
1760
1770
options . highWaterMark = 64 * 1024 ;
1761
1771
@@ -1921,7 +1931,7 @@ function WriteStream(path, options) {
1921
1931
if ( ! ( this instanceof WriteStream ) )
1922
1932
return new WriteStream ( path , options ) ;
1923
1933
1924
- options = Object . create ( getOptions ( options , { } ) ) ;
1934
+ options = copyObject ( getOptions ( options , { } ) ) ;
1925
1935
1926
1936
Writable . call ( this , options ) ;
1927
1937
0 commit comments