mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 15:11:08 +08:00
compiler: avoid undefined behavior in Import::read
For some implementations of Stream, advancing the stream will invalidate the previously-returned peek buffer. Copy the peek buffer before advancing in Import::read to avoid this undefined behavior. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/259438
This commit is contained in:
parent
fcae512115
commit
f5431aeaf5
@ -1,4 +1,4 @@
|
||||
d00febdab0535546ccbf1ef634be1f23b09c8b77
|
||||
613e530547549f4220c4571ea913acbe5fa56f72
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
@ -6212,7 +6212,7 @@ Function::import_func(Import* imp, std::string* pname,
|
||||
return false;
|
||||
}
|
||||
|
||||
*body = imp->read(static_cast<size_t>(llen));
|
||||
imp->read(static_cast<size_t>(llen), body);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1375,8 +1375,8 @@ Import::read_name()
|
||||
|
||||
// Read LENGTH bytes from the stream.
|
||||
|
||||
std::string
|
||||
Import::read(size_t length)
|
||||
void
|
||||
Import::read(size_t length, std::string* out)
|
||||
{
|
||||
const char* data;
|
||||
if (!this->stream_->peek(length, &data))
|
||||
@ -1385,10 +1385,11 @@ Import::read(size_t length)
|
||||
go_error_at(this->location_, "import error at %d: expected %d bytes",
|
||||
this->stream_->pos(), static_cast<int>(length));
|
||||
this->stream_->set_saw_error();
|
||||
return "";
|
||||
*out = std::string("");
|
||||
return;
|
||||
}
|
||||
*out = std::string(data, length);
|
||||
this->advance(length);
|
||||
return std::string(data, length);
|
||||
}
|
||||
|
||||
// Turn a string into a integer with appropriate error handling.
|
||||
|
@ -240,10 +240,10 @@ class Import : public Import_expression
|
||||
get_char()
|
||||
{ return this->stream_->get_char(); }
|
||||
|
||||
// Read LENGTH characters into a string and advance past them. On
|
||||
// EOF reports an error and returns an empty string.
|
||||
std::string
|
||||
read(size_t length);
|
||||
// Read LENGTH characters into *OUT and advance past them. On
|
||||
// EOF reports an error and sets *OUT to an empty string.
|
||||
void
|
||||
read(size_t length, std::string* out);
|
||||
|
||||
// Return true at the end of the stream.
|
||||
bool
|
||||
|
Loading…
x
Reference in New Issue
Block a user