[binutils-gdb] Have gold's File_read::do_read() function check the start parameter

Nick Clifton nickc@sourceware.org
Mon Jun 27 12:08:10 GMT 2022


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2a4fc266dbf77ed7ab83da16468e9ba627b8bc2d

commit 2a4fc266dbf77ed7ab83da16468e9ba627b8bc2d
Author: Nick Clifton <nickc@redhat.com>
Date:   Mon Jun 27 13:07:40 2022 +0100

    Have gold's File_read::do_read() function check the start parameter
    
            PR 23765
            * fileread.cc (File_read::do_read): Check start parameter before
            computing number of bytes to read.

Diff:
---
 gold/ChangeLog   | 6 ++++++
 gold/fileread.cc | 6 ++++++
 2 files changed, 12 insertions(+)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 5103dab7b67..8557dc6db7f 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,9 @@
+2022-06-27  Nick Clifton  <nickc@redhat.com>
+
+	PR 23765
+	* fileread.cc (File_read::do_read): Check start parameter before
+	computing number of bytes to read.
+
 2022-05-18  Nick Clifton  <nickc@redhat.com>
 
 	* int_encoding.cc (get_length_as_unsigned_LEB_128): Remove
diff --git a/gold/fileread.cc b/gold/fileread.cc
index 2b653f78c2e..af2df215468 100644
--- a/gold/fileread.cc
+++ b/gold/fileread.cc
@@ -385,6 +385,12 @@ File_read::do_read(off_t start, section_size_type size, void* p)
   ssize_t bytes;
   if (this->whole_file_view_ != NULL)
     {
+      // See PR 23765 for an example of a testcase that triggers this error.
+      if (((ssize_t) start) < 0)
+	gold_fatal(_("%s: read failed, starting offset (%#llx) less than zero"),
+		   this->filename().c_str(),
+		   static_cast<long long>(start));
+	
       bytes = this->size_ - start;
       if (static_cast<section_size_type>(bytes) >= size)
 	{


More information about the Binutils-cvs mailing list