@@ -165,6 +165,21 @@ function validateFd(fd) {
165
165
}
166
166
}
167
167
168
+ function validateOffsetLengthRead ( offset , length , bufferLength ) {
169
+ let err ;
170
+
171
+ if ( offset < 0 || offset >= bufferLength ) {
172
+ err = new errors . RangeError ( 'ERR_OUT_OF_RANGE' , 'offset' ) ;
173
+ } else if ( length < 0 || offset + length > bufferLength ) {
174
+ err = new errors . RangeError ( 'ERR_OUT_OF_RANGE' , 'length' ) ;
175
+ }
176
+
177
+ if ( err !== undefined ) {
178
+ Error . captureStackTrace ( err , validateOffsetLengthRead ) ;
179
+ throw err ;
180
+ }
181
+ }
182
+
168
183
// Special case of `makeCallback()` that is specific to async `*stat()` calls as
169
184
// an optimization, since the data passed back to the callback needs to be
170
185
// transformed anyway.
@@ -743,11 +758,7 @@ fs.read = function(fd, buffer, offset, length, position, callback) {
743
758
} ) ;
744
759
}
745
760
746
- if ( offset < 0 || offset >= buffer . length )
747
- throw new errors . RangeError ( 'ERR_OUT_OF_RANGE' , 'offset' ) ;
748
-
749
- if ( length < 0 || offset + length > buffer . length )
750
- throw new errors . RangeError ( 'ERR_OUT_OF_RANGE' , 'length' ) ;
761
+ validateOffsetLengthRead ( offset , length , buffer . length ) ;
751
762
752
763
if ( ! isUint32 ( position ) )
753
764
position = - 1 ;
@@ -779,11 +790,7 @@ fs.readSync = function(fd, buffer, offset, length, position) {
779
790
return 0 ;
780
791
}
781
792
782
- if ( offset < 0 || offset >= buffer . length )
783
- throw new errors . RangeError ( 'ERR_OUT_OF_RANGE' , 'offset' ) ;
784
-
785
- if ( length < 0 || offset + length > buffer . length )
786
- throw new errors . RangeError ( 'ERR_OUT_OF_RANGE' , 'length' ) ;
793
+ validateOffsetLengthRead ( offset , length , buffer . length ) ;
787
794
788
795
if ( ! isUint32 ( position ) )
789
796
position = - 1 ;
0 commit comments