@@ -81,16 +81,6 @@ function throwOptionsError(options) {
81
81
'but got ' + typeof options + ' instead' ) ;
82
82
}
83
83
84
- function isFD ( fd ) {
85
- return Number . isInteger ( fd ) && fd >= 0 && fd <= 0xFFFFFFFF ;
86
- }
87
-
88
- function sanitizeFD ( fd ) {
89
- if ( ! isFD ( fd ) )
90
- throw new TypeError ( 'file descriptor must be a unsigned 32-bit integer' ) ;
91
- return fd ;
92
- }
93
-
94
84
// Ensure that callbacks run in the global context. Only use this function
95
85
// for callbacks that are passed to the binding layer, callbacks that are
96
86
// invoked from JS already run in the proper scope.
@@ -122,6 +112,10 @@ function nullCheck(path, callback) {
122
112
return true ;
123
113
}
124
114
115
+ function isFd ( path ) {
116
+ return ( path >>> 0 ) === path ;
117
+ }
118
+
125
119
// Static method to set the stats properties on a Stats object.
126
120
fs . Stats = function (
127
121
dev ,
@@ -263,7 +257,7 @@ fs.readFile = function(path, options, callback) {
263
257
return ;
264
258
265
259
var context = new ReadFileContext ( callback , encoding ) ;
266
- context . isUserFd = isFD ( path ) ; // file descriptor ownership
260
+ context . isUserFd = isFd ( path ) ; // file descriptor ownership
267
261
var req = new FSReqWrap ( ) ;
268
262
req . context = context ;
269
263
req . oncomplete = readFileAfterOpen ;
@@ -479,7 +473,7 @@ fs.readFileSync = function(path, options) {
479
473
assertEncoding ( encoding ) ;
480
474
481
475
var flag = options . flag || 'r' ;
482
- var isUserFd = isFD ( path ) ; // file descriptor ownership
476
+ var isUserFd = isFd ( path ) ; // file descriptor ownership
483
477
var fd = isUserFd ? path : fs . openSync ( path , flag , 0o666 ) ;
484
478
485
479
var st = tryStatSync ( fd , isUserFd ) ;
@@ -576,12 +570,12 @@ Object.defineProperty(exports, '_stringToFlags', {
576
570
577
571
fs . close = function ( fd , callback ) {
578
572
var req = new FSReqWrap ( ) ;
579
- req . oncomplete = makeCallback ( callback ) ;
580
- binding . close ( sanitizeFD ( fd ) , req ) ;
573
+ req . oncomplete = makeCallback ( arguments [ arguments . length - 1 ] ) ;
574
+ binding . close ( fd , req ) ;
581
575
} ;
582
576
583
577
fs . closeSync = function ( fd ) {
584
- return binding . close ( sanitizeFD ( fd ) ) ;
578
+ return binding . close ( fd ) ;
585
579
} ;
586
580
587
581
function modeNum ( m , def ) {
@@ -618,7 +612,6 @@ fs.openSync = function(path, flags, mode) {
618
612
var readWarned = false ;
619
613
fs . read = function ( fd , buffer , offset , length , position , callback ) {
620
614
callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
621
- fd = sanitizeFD ( fd ) ;
622
615
if ( ! ( buffer instanceof Buffer ) ) {
623
616
// legacy string interface (fd, length, position, encoding, callback)
624
617
readWarned = printDeprecation ( 'fs.read\'s legacy String interface ' +
@@ -679,7 +672,6 @@ fs.readSync = function(fd, buffer, offset, length, position) {
679
672
var legacy = false ;
680
673
var encoding ;
681
674
682
- fd = sanitizeFD ( fd ) ;
683
675
if ( ! ( buffer instanceof Buffer ) ) {
684
676
// legacy string interface (fd, length, position, encoding, callback)
685
677
readSyncWarned = printDeprecation ( 'fs.readSync\'s legacy String interface' +
@@ -721,7 +713,6 @@ fs.readSync = function(fd, buffer, offset, length, position) {
721
713
// fs.write(fd, string[, position[, encoding]], callback);
722
714
fs . write = function ( fd , buffer , offset , length , position , callback ) {
723
715
callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
724
- fd = sanitizeFD ( fd ) ;
725
716
function wrapper ( err , written ) {
726
717
// Retain a reference to buffer so that it can't be GC'ed too soon.
727
718
callback ( err , written || 0 , buffer ) ;
@@ -757,7 +748,6 @@ fs.write = function(fd, buffer, offset, length, position, callback) {
757
748
// OR
758
749
// fs.writeSync(fd, string[, position[, encoding]]);
759
750
fs . writeSync = function ( fd , buffer , offset , length , position ) {
760
- fd = sanitizeFD ( fd ) ;
761
751
if ( buffer instanceof Buffer ) {
762
752
if ( position === undefined )
763
753
position = null ;
@@ -789,18 +779,14 @@ fs.renameSync = function(oldPath, newPath) {
789
779
} ;
790
780
791
781
fs . truncate = function ( path , len , callback ) {
792
- callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
793
-
794
- if ( isFD ( path ) )
782
+ if ( typeof path === 'number' ) {
795
783
return fs . ftruncate ( path , len , callback ) ;
784
+ }
796
785
797
- if ( typeof path !== 'string' )
798
- throw new TypeError ( 'path must be a string' ) ;
786
+ callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
799
787
800
- if ( typeof len === 'function' || len == undefined ) {
788
+ if ( typeof len === 'function' || len === undefined ) {
801
789
len = 0 ;
802
- } else if ( ! Number . isInteger ( len ) || len < 0 ) {
803
- throw new TypeError ( 'length must be a positive integer' ) ;
804
790
}
805
791
806
792
fs . open ( path , 'r+' , function ( er , fd ) {
@@ -816,18 +802,13 @@ fs.truncate = function(path, len, callback) {
816
802
} ;
817
803
818
804
fs . truncateSync = function ( path , len ) {
819
- if ( isFD ( path ) )
805
+ if ( typeof path === 'number' ) {
806
+ // legacy
820
807
return fs . ftruncateSync ( path , len ) ;
821
-
822
- if ( typeof path !== 'string' )
823
- throw new TypeError ( 'path must be a string' ) ;
824
-
825
- if ( len === undefined || len === null ) {
808
+ }
809
+ if ( len === undefined ) {
826
810
len = 0 ;
827
- } else if ( ! Number . isInteger ( len ) || len < 0 ) {
828
- throw new TypeError ( 'length must be a positive integer' ) ;
829
811
}
830
-
831
812
// allow error to be thrown, but still close fd.
832
813
var fd = fs . openSync ( path , 'r+' ) ;
833
814
var ret ;
@@ -841,30 +822,18 @@ fs.truncateSync = function(path, len) {
841
822
} ;
842
823
843
824
fs . ftruncate = function ( fd , len , callback ) {
844
- callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
845
-
846
- fd = sanitizeFD ( fd ) ;
847
-
848
- if ( typeof len === 'function' || len == undefined ) {
825
+ if ( typeof len === 'function' || len === undefined ) {
849
826
len = 0 ;
850
- } else if ( ! Number . isInteger ( len ) || len < 0 ) {
851
- throw new TypeError ( 'length must be a positive integer' ) ;
852
827
}
853
-
854
828
var req = new FSReqWrap ( ) ;
855
- req . oncomplete = callback ;
829
+ req . oncomplete = makeCallback ( arguments [ arguments . length - 1 ] ) ;
856
830
binding . ftruncate ( fd , len , req ) ;
857
831
} ;
858
832
859
833
fs . ftruncateSync = function ( fd , len ) {
860
- fd = sanitizeFD ( fd ) ;
861
-
862
- if ( len === undefined || len === null ) {
834
+ if ( len === undefined ) {
863
835
len = 0 ;
864
- } else if ( ! Number . isInteger ( len ) || len < 0 ) {
865
- throw new TypeError ( 'length must be a positive integer' ) ;
866
836
}
867
-
868
837
return binding . ftruncate ( fd , len ) ;
869
838
} ;
870
839
@@ -884,21 +853,21 @@ fs.rmdirSync = function(path) {
884
853
fs . fdatasync = function ( fd , callback ) {
885
854
var req = new FSReqWrap ( ) ;
886
855
req . oncomplete = makeCallback ( callback ) ;
887
- binding . fdatasync ( sanitizeFD ( fd ) , req ) ;
856
+ binding . fdatasync ( fd , req ) ;
888
857
} ;
889
858
890
859
fs . fdatasyncSync = function ( fd ) {
891
- return binding . fdatasync ( sanitizeFD ( fd ) ) ;
860
+ return binding . fdatasync ( fd ) ;
892
861
} ;
893
862
894
863
fs . fsync = function ( fd , callback ) {
895
864
var req = new FSReqWrap ( ) ;
896
- req . oncomplete = makeCallback ( callback ) ;
897
- binding . fsync ( sanitizeFD ( fd ) , req ) ;
865
+ req . oncomplete = makeCallback ( arguments [ arguments . length - 1 ] ) ;
866
+ binding . fsync ( fd , req ) ;
898
867
} ;
899
868
900
869
fs . fsyncSync = function ( fd ) {
901
- return binding . fsync ( sanitizeFD ( fd ) ) ;
870
+ return binding . fsync ( fd ) ;
902
871
} ;
903
872
904
873
fs . mkdir = function ( path , mode , callback ) {
@@ -946,8 +915,8 @@ fs.readdirSync = function(path, options) {
946
915
947
916
fs . fstat = function ( fd , callback ) {
948
917
var req = new FSReqWrap ( ) ;
949
- req . oncomplete = makeCallback ( callback ) ;
950
- binding . fstat ( sanitizeFD ( fd ) , req ) ;
918
+ req . oncomplete = makeCallback ( arguments [ arguments . length - 1 ] ) ;
919
+ binding . fstat ( fd , req ) ;
951
920
} ;
952
921
953
922
fs . lstat = function ( path , callback ) {
@@ -967,7 +936,7 @@ fs.stat = function(path, callback) {
967
936
} ;
968
937
969
938
fs . fstatSync = function ( fd ) {
970
- return binding . fstat ( sanitizeFD ( fd ) ) ;
939
+ return binding . fstat ( fd ) ;
971
940
} ;
972
941
973
942
fs . lstatSync = function ( path ) {
@@ -1084,11 +1053,11 @@ fs.unlinkSync = function(path) {
1084
1053
fs . fchmod = function ( fd , mode , callback ) {
1085
1054
var req = new FSReqWrap ( ) ;
1086
1055
req . oncomplete = makeCallback ( arguments [ arguments . length - 1 ] ) ;
1087
- binding . fchmod ( sanitizeFD ( fd ) , modeNum ( mode ) , req ) ;
1056
+ binding . fchmod ( fd , modeNum ( mode ) , req ) ;
1088
1057
} ;
1089
1058
1090
1059
fs . fchmodSync = function ( fd , mode ) {
1091
- return binding . fchmod ( sanitizeFD ( fd ) , modeNum ( mode ) ) ;
1060
+ return binding . fchmod ( fd , modeNum ( mode ) ) ;
1092
1061
} ;
1093
1062
1094
1063
if ( constants . hasOwnProperty ( 'O_SYMLINK' ) ) {
@@ -1167,11 +1136,11 @@ if (constants.hasOwnProperty('O_SYMLINK')) {
1167
1136
fs . fchown = function ( fd , uid , gid , callback ) {
1168
1137
var req = new FSReqWrap ( ) ;
1169
1138
req . oncomplete = makeCallback ( arguments [ arguments . length - 1 ] ) ;
1170
- binding . fchown ( sanitizeFD ( fd ) , uid , gid , req ) ;
1139
+ binding . fchown ( fd , uid , gid , req ) ;
1171
1140
} ;
1172
1141
1173
1142
fs . fchownSync = function ( fd , uid , gid ) {
1174
- return binding . fchown ( sanitizeFD ( fd ) , uid , gid ) ;
1143
+ return binding . fchown ( fd , uid , gid ) ;
1175
1144
} ;
1176
1145
1177
1146
fs . chown = function ( path , uid , gid , callback ) {
@@ -1228,7 +1197,6 @@ fs.utimesSync = function(path, atime, mtime) {
1228
1197
1229
1198
fs . futimes = function ( fd , atime , mtime , callback ) {
1230
1199
callback = makeCallback ( arguments [ arguments . length - 1 ] ) ;
1231
- fd = sanitizeFD ( fd ) ;
1232
1200
atime = toUnixTimestamp ( atime ) ;
1233
1201
mtime = toUnixTimestamp ( mtime ) ;
1234
1202
var req = new FSReqWrap ( ) ;
@@ -1237,7 +1205,6 @@ fs.futimes = function(fd, atime, mtime, callback) {
1237
1205
} ;
1238
1206
1239
1207
fs . futimesSync = function ( fd , atime , mtime ) {
1240
- fd = sanitizeFD ( fd ) ;
1241
1208
atime = toUnixTimestamp ( atime ) ;
1242
1209
mtime = toUnixTimestamp ( mtime ) ;
1243
1210
binding . futimes ( fd , atime , mtime ) ;
@@ -1290,7 +1257,7 @@ fs.writeFile = function(path, data, options, callback) {
1290
1257
1291
1258
var flag = options . flag || 'w' ;
1292
1259
1293
- if ( isFD ( path ) ) {
1260
+ if ( isFd ( path ) ) {
1294
1261
writeFd ( path , true ) ;
1295
1262
return ;
1296
1263
}
@@ -1324,7 +1291,7 @@ fs.writeFileSync = function(path, data, options) {
1324
1291
assertEncoding ( options . encoding ) ;
1325
1292
1326
1293
var flag = options . flag || 'w' ;
1327
- var isUserFd = isFD ( path ) ; // file descriptor ownership
1294
+ var isUserFd = isFd ( path ) ; // file descriptor ownership
1328
1295
var fd = isUserFd ? path : fs . openSync ( path , flag , options . mode ) ;
1329
1296
1330
1297
if ( ! ( data instanceof Buffer ) ) {
@@ -1362,7 +1329,7 @@ fs.appendFile = function(path, data, options, callback) {
1362
1329
options = util . _extend ( { flag : 'a' } , options ) ;
1363
1330
1364
1331
// force append behavior when using a supplied file descriptor
1365
- if ( isFD ( path ) )
1332
+ if ( isFd ( path ) )
1366
1333
options . flag = 'a' ;
1367
1334
1368
1335
fs . writeFile ( path , data , options , callback ) ;
@@ -1381,7 +1348,7 @@ fs.appendFileSync = function(path, data, options) {
1381
1348
options = util . _extend ( { flag : 'a' } , options ) ;
1382
1349
1383
1350
// force append behavior when using a supplied file descriptor
1384
- if ( isFD ( path ) )
1351
+ if ( isFd ( path ) )
1385
1352
options . flag = 'a' ;
1386
1353
1387
1354
fs . writeFileSync ( path , data , options ) ;
@@ -1965,7 +1932,7 @@ function SyncWriteStream(fd, options) {
1965
1932
1966
1933
options = options || { } ;
1967
1934
1968
- this . fd = sanitizeFD ( fd ) ;
1935
+ this . fd = fd ;
1969
1936
this . writable = true ;
1970
1937
this . readable = false ;
1971
1938
this . autoClose = options . autoClose === undefined ? true : options . autoClose ;
0 commit comments