diff options
author | Nikhil Benesch <nikhil.benesch@gmail.com> | 2020-10-04 23:40:40 -0400 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-10-06 13:53:42 -0700 |
commit | f5431aeaf5551995e1ec4455e33545bbc1170a1b (patch) | |
tree | b86130cccc5ee6c5698061672064106be54aa590 /gcc/go | |
parent | fcae5121154d1c3382b056bcc2c563cedac28e74 (diff) | |
download | gcc-f5431aeaf5551995e1ec4455e33545bbc1170a1b.zip gcc-f5431aeaf5551995e1ec4455e33545bbc1170a1b.tar.gz gcc-f5431aeaf5551995e1ec4455e33545bbc1170a1b.tar.bz2 |
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
Diffstat (limited to 'gcc/go')
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/gogo.cc | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/import.cc | 9 | ||||
-rw-r--r-- | gcc/go/gofrontend/import.h | 8 |
4 files changed, 11 insertions, 10 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 701b2d42..c5c02aa 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index aef1c47..f40f131 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -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; diff --git a/gcc/go/gofrontend/import.cc b/gcc/go/gofrontend/import.cc index 081afef..c6c1178 100644 --- a/gcc/go/gofrontend/import.cc +++ b/gcc/go/gofrontend/import.cc @@ -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. diff --git a/gcc/go/gofrontend/import.h b/gcc/go/gofrontend/import.h index b12b3b8..1d8aae4 100644 --- a/gcc/go/gofrontend/import.h +++ b/gcc/go/gofrontend/import.h @@ -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 |