aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorNikhil Benesch <nikhil.benesch@gmail.com>2020-10-04 23:40:40 -0400
committerIan Lance Taylor <iant@golang.org>2020-10-06 13:53:42 -0700
commitf5431aeaf5551995e1ec4455e33545bbc1170a1b (patch)
treeb86130cccc5ee6c5698061672064106be54aa590 /gcc/go
parentfcae5121154d1c3382b056bcc2c563cedac28e74 (diff)
downloadgcc-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/MERGE2
-rw-r--r--gcc/go/gofrontend/gogo.cc2
-rw-r--r--gcc/go/gofrontend/import.cc9
-rw-r--r--gcc/go/gofrontend/import.h8
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