@@ -538,6 +538,7 @@ async function readFileHandle(filehandle, options) {
538538 throw new ERR_FS_FILE_TOO_LARGE ( size ) ;
539539
540540 let totalRead = 0 ;
541+ const noSize = size === 0 ;
541542 let buffer = Buffer . allocUnsafeSlow ( length ) ;
542543 let result = '' ;
543544 let offset = 0 ;
@@ -560,7 +561,7 @@ async function readFileHandle(filehandle, options) {
560561
561562 if ( bytesRead === 0 ||
562563 totalRead === size ||
563- ( bytesRead !== buffer . length && ! chunkedRead ) ) {
564+ ( bytesRead !== buffer . length && ! chunkedRead && ! noSize ) ) {
564565 const singleRead = bytesRead === totalRead ;
565566
566567 const bytesToCheck = chunkedRead ? totalRead : bytesRead ;
@@ -570,7 +571,7 @@ async function readFileHandle(filehandle, options) {
570571 }
571572
572573 if ( ! encoding ) {
573- if ( size === 0 && ! singleRead ) {
574+ if ( noSize && ! singleRead ) {
574575 ArrayPrototypePush ( buffers , buffer ) ;
575576 return Buffer . concat ( buffers , totalRead ) ;
576577 }
@@ -583,15 +584,17 @@ async function readFileHandle(filehandle, options) {
583584 result += decoder . end ( buffer ) ;
584585 return result ;
585586 }
586-
587+ const readBuffer = bytesRead !== buffer . length ?
588+ buffer . subarray ( 0 , bytesRead ) :
589+ buffer ;
587590 if ( encoding ) {
588- result += decoder . write ( buffer ) ;
591+ result += decoder . write ( readBuffer ) ;
589592 } else if ( size !== 0 ) {
590593 offset = totalRead ;
591594 } else {
592595 buffers ??= [ ] ;
593596 // Unknown file size requires chunks.
594- ArrayPrototypePush ( buffers , buffer ) ;
597+ ArrayPrototypePush ( buffers , readBuffer ) ;
595598 buffer = Buffer . allocUnsafeSlow ( kReadFileUnknownBufferLength ) ;
596599 }
597600 }
0 commit comments