@@ -539,6 +539,7 @@ async function readFileHandle(filehandle, options) {
539539 throw new ERR_FS_FILE_TOO_LARGE ( size ) ;
540540
541541 let totalRead = 0 ;
542+ const noSize = size === 0 ;
542543 let buffer = Buffer . allocUnsafeSlow ( length ) ;
543544 let result = '' ;
544545 let offset = 0 ;
@@ -561,7 +562,7 @@ async function readFileHandle(filehandle, options) {
561562
562563 if ( bytesRead === 0 ||
563564 totalRead === size ||
564- ( bytesRead !== buffer . length && ! chunkedRead ) ) {
565+ ( bytesRead !== buffer . length && ! chunkedRead && ! noSize ) ) {
565566 const singleRead = bytesRead === totalRead ;
566567
567568 const bytesToCheck = chunkedRead ? totalRead : bytesRead ;
@@ -571,7 +572,7 @@ async function readFileHandle(filehandle, options) {
571572 }
572573
573574 if ( ! encoding ) {
574- if ( size === 0 && ! singleRead ) {
575+ if ( noSize && ! singleRead ) {
575576 ArrayPrototypePush ( buffers , buffer ) ;
576577 return Buffer . concat ( buffers , totalRead ) ;
577578 }
@@ -584,15 +585,17 @@ async function readFileHandle(filehandle, options) {
584585 result += decoder . end ( buffer ) ;
585586 return result ;
586587 }
587-
588+ const readBuffer = bytesRead !== buffer . length ?
589+ buffer . subarray ( 0 , bytesRead ) :
590+ buffer ;
588591 if ( encoding ) {
589- result += decoder . write ( buffer ) ;
592+ result += decoder . write ( readBuffer ) ;
590593 } else if ( size !== 0 ) {
591594 offset = totalRead ;
592595 } else {
593596 buffers ??= [ ] ;
594597 // Unknown file size requires chunks.
595- ArrayPrototypePush ( buffers , buffer ) ;
598+ ArrayPrototypePush ( buffers , readBuffer ) ;
596599 buffer = Buffer . allocUnsafeSlow ( kReadFileUnknownBufferLength ) ;
597600 }
598601 }
0 commit comments