From 5c727cf6259e7f71185fb647b52cbe3907cc4774 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 18 Apr 2019 04:11:22 +0000 Subject: [PATCH] re PR go/90110 (libgo fails to build against glibc 2.19) PR go/90110 compiler: use temporary to avoid early destruction The code was passing a substr directly to strtol, and then checking the *end value returned by strtol. But the substr could be destroyed as soon as strtol returns, making the test of *end invalid. Also fix an incorrect test of the string index rather than the value. Fixes https://gcc.gnu.org/PR90110 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/172663 From-SVN: r270434 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/import.cc | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 381d791da8c..6007b4f750a 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -20010e494f46d8fd58cfd372093b059578d3379a +ecbd6562aff604b9559f63d714e922a0c9c2a77f 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/import.cc b/gcc/go/gofrontend/import.cc index d783043ec04..c1982eb4300 100644 --- a/gcc/go/gofrontend/import.cc +++ b/gcc/go/gofrontend/import.cc @@ -1478,8 +1478,9 @@ Import_function_body::read_type() this->off_ = i + 1; char *end; - long val = strtol(this->body_.substr(start, i - start).c_str(), &end, 10); - if (*end != '\0' || i > 0x7fffffff) + std::string num = this->body_.substr(start, i - start); + long val = strtol(num.c_str(), &end, 10); + if (*end != '\0' || val > 0x7fffffff) { if (!this->saw_error_) go_error_at(this->location(), -- 2.30.2