Skip to content

Commit ea16f7d

Browse files
[libcxx] Fix xsgetn in basic_filebuf (#167779)
The optimized version of xsgetn for basic_filebuf added in #165223 has an issue where if the reads come from both the buffer and the filesystem it returns the wrong number of characters. This patch should address the issue.
1 parent 89c08ad commit ea16f7d

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

libcxx/include/fstream

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,14 @@ protected:
315315
traits_type::copy(__str, this->gptr(), __n);
316316
this->__gbump_ptrdiff(__n);
317317
}
318-
if (__len - __n >= this->egptr() - this->eback())
319-
return std::fread(__str + __n, sizeof(char_type), __len - __n, __file_);
318+
const streamsize __remainder = __len - __n;
319+
const streamsize __buffer_space = this->egptr() - this->eback();
320+
321+
if (__remainder >= __buffer_space)
322+
return std::fread(__str + __n, sizeof(char_type), __remainder, __file_) + __n;
323+
else if (__remainder > 0)
324+
return basic_streambuf<_CharT, _Traits>::xsgetn(__str + __n, __remainder) + __n;
325+
return __n;
320326
}
321327
return basic_streambuf<_CharT, _Traits>::xsgetn(__str, __len);
322328
}

0 commit comments

Comments
 (0)