Improved log file parser code from Guilherme. Fixes memleak on exception
authorThomas Jarosch <thomas.jarosch@intra2net.com>
Tue, 14 Jun 2011 14:19:02 +0000 (16:19 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Tue, 14 Jun 2011 14:19:02 +0000 (16:19 +0200)
src/logread.cpp

index 6e5d822..45d4d70 100644 (file)
@@ -23,8 +23,11 @@ on this file might be covered by the GNU General Public License.
 #include <unistd.h>
 #include <stdio.h>
 
+#include <fstream>
 #include <stdexcept>
 
+#include <boost/scoped_array.hpp>
+
 #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<char> 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;
 }