@@ -516,6 +516,7 @@ static void InternalModuleReadFile(const FunctionCallbackInfo<Value>& args) {
516
516
int64_t offset = 0 ;
517
517
ssize_t numchars;
518
518
do {
519
+ const size_t kBlockSize = 32 << 10 ;
519
520
const size_t start = chars.size ();
520
521
chars.resize (start + kBlockSize );
521
522
@@ -527,25 +528,38 @@ static void InternalModuleReadFile(const FunctionCallbackInfo<Value>& args) {
527
528
numchars = uv_fs_read (loop, &read_req, fd, &buf, 1 , offset, nullptr );
528
529
uv_fs_req_cleanup (&read_req);
529
530
530
- CHECK_GE (numchars, 0 );
531
+ if (numchars < 0 ) {
532
+ break ;
533
+ }
534
+
535
+ if (static_cast <size_t >(numchars) < kBlockSize ) {
536
+ chars.resize (start + numchars);
537
+ }
538
+ if (numchars == 0 ) {
539
+ break ;
540
+ }
531
541
offset += numchars;
532
542
} while (static_cast <size_t >(numchars) == kBlockSize );
533
543
534
544
uv_fs_t close_req;
535
545
CHECK_EQ (0 , uv_fs_close (loop, &close_req, fd, nullptr ));
536
546
uv_fs_req_cleanup (&close_req);
537
547
538
- size_t start = 0 ;
539
- if (offset >= 3 && 0 == memcmp (&chars[0 ], " \xEF\xBB\xBF " , 3 )) {
540
- start = 3 ; // Skip UTF-8 BOM.
541
- }
548
+ if (numchars < 0 ) {
549
+ args.GetReturnValue ().Set (Undefined (env->isolate ()));
550
+ } else {
551
+ size_t start = 0 ;
552
+ if (chars.size () >= 3 && 0 == memcmp (&chars[0 ], " \xEF\xBB\xBF " , 3 )) {
553
+ start = 3 ; // Skip UTF-8 BOM.
554
+ }
542
555
543
- Local<String> chars_string =
544
- String::NewFromUtf8 (env->isolate (),
545
- &chars[start],
546
- String::kNormalString ,
547
- offset - start);
548
- args.GetReturnValue ().Set (chars_string);
556
+ Local<String> chars_string =
557
+ String::NewFromUtf8 (env->isolate (),
558
+ &chars[start],
559
+ String::kNormalString ,
560
+ chars.size () - start);
561
+ args.GetReturnValue ().Set (chars_string);
562
+ }
549
563
}
550
564
551
565
// Used to speed up module loading. Returns 0 if the path refers to
0 commit comments