From fa39392db84125cf95c65e843ddc76a7e638ba60 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 31 May 2017 15:48:52 +0100 Subject: [PATCH] Fix endless loop bug Throw if input format is incorrect --- src/util/irep_serialization.cpp | 13 ++++++++++++- src/util/irep_serialization.h | 6 ++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/util/irep_serialization.cpp b/src/util/irep_serialization.cpp index 92f975ef949..1d67b365b7a 100644 --- a/src/util/irep_serialization.cpp +++ b/src/util/irep_serialization.cpp @@ -18,6 +18,11 @@ Date: May 2007 #include "string_hash.h" +irep_serialization_errort::irep_serialization_errort(const std::string &error): + std::runtime_error(error) +{ +} + void irep_serializationt::write_irep( std::ostream &out, const irept &irep) @@ -225,11 +230,17 @@ void write_gb_string(std::ostream &out, const std::string &s) /// \return a string irep_idt irep_serializationt::read_gb_string(std::istream &in) { - char c; + char c='\0'; size_t length=0; while((c=static_cast(in.get()))!=0) { + if(!in.good()) + { + throw irep_serialization_errort( + "found non-null-terminated string while parsing input"); + } + if(length>=read_buffer.size()) read_buffer.resize(read_buffer.size()*2, 0); diff --git a/src/util/irep_serialization.h b/src/util/irep_serialization.h index 6162826475a..cff0fbc0b04 100644 --- a/src/util/irep_serialization.h +++ b/src/util/irep_serialization.h @@ -22,6 +22,12 @@ Date: May 2007 #include "irep_hash_container.h" #include "irep.h" +class irep_serialization_errort:public std::runtime_error +{ +public: + explicit irep_serialization_errort(const std::string &error); +}; + void write_gb_word(std::ostream &, std::size_t); void write_gb_string(std::ostream &, const std::string &);