From 8843e3203077752ae8afe079eb36071aab64869a Mon Sep 17 00:00:00 2001 From: Thomas Jarosch Date: Tue, 14 Jun 2011 16:19:02 +0200 Subject: [PATCH] Improved log file parser code from Guilherme. Fixes memleak on exception --- src/logread.cpp | 21 ++++++++++++--------- 1 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/logread.cpp b/src/logread.cpp index 6e5d822..45d4d70 100644 --- a/src/logread.cpp +++ b/src/logread.cpp @@ -23,8 +23,11 @@ on this file might be covered by the GNU General Public License. #include #include +#include #include +#include + #include "logread.hxx" using namespace std; @@ -98,24 +101,24 @@ bool logread::check_changed() string logread::getLogChanges() { // open logfile - FILE *log = fopen (filename.c_str(), "r"); - if (!log) + ifstream log( filename.c_str(), ifstream::in ); + if ( !log.is_open() ) return ""; // read logfile int size = logsize-logsize_old; - char *read_buffer = new char [size+1]; - if (fseek (log, logsize_old, SEEK_SET) != 0) + boost::scoped_array read_buffer( new char[ size + 1 ] ); + log.seekg( logsize_old, fstream::beg ); + if ( log.rdstate() != fstream::goodbit ) throw runtime_error("can't seek in file " + filename); - fread (read_buffer, size, 1, log); - if (ferror(log)) + log.read( read_buffer.get(), size ); + if ( log.rdstate() != fstream::goodbit ) throw runtime_error("error reading from file " + filename); - fclose (log); + log.close(); read_buffer[size] = 0; - string changes(read_buffer); - delete[] read_buffer; + string changes( read_buffer.get() ); return changes; } -- 1.7.1