From 87893e3644a3cdee366be70c9fb6d05ea6418351 Mon Sep 17 00:00:00 2001
From: Emmanuel Christophe <emmanuel.christophe@orfeo-toolbox.org>
Date: Sun, 17 Jan 2010 18:25:04 +0800
Subject: [PATCH] BUG: fix memory leaks

---
 Code/IO/otbImageFileReader.txx                   |  1 +
 .../ossim/EnvisatAsar/EnvisatAsarRecord.h        |  3 +++
 .../otbossimplugins/ossim/RadarSat/Data/Data.cpp | 16 ++++++++++------
 .../ossim/RadarSat/Data/DataFactory.cpp          | 11 +++++++++++
 .../ossim/RadarSat/Data/ProcessedDataRecord.h    |  3 +++
 .../ossim/RadarSat/Leader/Leader.cpp             |  2 +-
 .../ossim/RadarSat/Leader/LeaderFactory.cpp      | 13 +++++++++++++
 .../ossim/ossimRadarSat2Model.cpp                |  3 ++-
 .../otbossimplugins/ossim/ossimRadarSatModel.cpp | 13 +++++++++++++
 9 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/Code/IO/otbImageFileReader.txx b/Code/IO/otbImageFileReader.txx
index f8b80ce373..7fc06d715d 100644
--- a/Code/IO/otbImageFileReader.txx
+++ b/Code/IO/otbImageFileReader.txx
@@ -380,6 +380,7 @@ ImageFileReader<TOutputImage>
          if (projection)
            {
              hasMetaData = projection->saveState(geom_kwl);
+             delete projection;
            }
        }
       // Free memory
diff --git a/Utilities/otbossimplugins/ossim/EnvisatAsar/EnvisatAsarRecord.h b/Utilities/otbossimplugins/ossim/EnvisatAsar/EnvisatAsarRecord.h
index e653bb8589..5edc646999 100644
--- a/Utilities/otbossimplugins/ossim/EnvisatAsar/EnvisatAsarRecord.h
+++ b/Utilities/otbossimplugins/ossim/EnvisatAsar/EnvisatAsarRecord.h
@@ -97,6 +97,9 @@ protected:
         res[nb_octets-1-i] = buffer[i];
       }
       memcpy(&value,res,nb_octets);
+
+      free(buffer);
+      free(res);
     }
   }
 
diff --git a/Utilities/otbossimplugins/ossim/RadarSat/Data/Data.cpp b/Utilities/otbossimplugins/ossim/RadarSat/Data/Data.cpp
index d942d48307..86aabd5fbc 100644
--- a/Utilities/otbossimplugins/ossim/RadarSat/Data/Data.cpp
+++ b/Utilities/otbossimplugins/ossim/RadarSat/Data/Data.cpp
@@ -68,7 +68,7 @@ std::istream& operator>>(std::istream& is, Data& data)
 		else
 		{
 			if (header.get_rec_seq() == 1) { // ImageOptionsFileDescriptor
-				RadarSatRecord* record = factory.Instanciate(header.get_rec_seq());
+      				RadarSatRecord* record = factory.Instanciate(header.get_rec_seq());
 				if (record != NULL)
 				{
 					record->Read(is);
@@ -80,12 +80,13 @@ std::istream& operator>>(std::istream& is, Data& data)
 				{
 					char* buff = new char[header.get_length()-12];
 					is.read(buff, header.get_length()-12);
-					delete buff;
+					delete[] buff;
 				}
 			}
 			else if ((header.get_rec_seq() == 2)) { // First line ProcessedDataRecord
-				RadarSatRecord* record = factory.Instanciate(2);
+
 				lineLength = header.get_length() ;
+      				RadarSatRecord* record = factory.Instanciate(2);
 				if (record != NULL)
 				{
 					record->Read(is);
@@ -93,28 +94,31 @@ std::istream& operator>>(std::istream& is, Data& data)
 
 					char* buff = new char[header.get_length()-192];
 					is.read(buff, header.get_length()-192);	// Reads the rest of the line
+					delete[] buff;
 				}
 				else
 				{
 					char* buff = new char[header.get_length()-12];
 					is.read(buff, header.get_length()-12);
-					delete buff;
+					delete[] buff;
 				}
 			}
 			else if ((header.get_rec_seq() == (1+nbLin))) { // Last line ProcessedDataRecord
-				RadarSatRecord* record = factory.Instanciate(2);
+      				RadarSatRecord* record = factory.Instanciate(2);
 				if (record != NULL)
 				{
 					record->Read(is);
 					data._records[Data::LastProcessedDataRecordID] = record;
+
 					char* buff = new char[header.get_length()-192];
 					is.read(buff, header.get_length()-192);	// Reads the rest of the line
+					delete[] buff;
 				}
 				else
 				{
 					char* buff = new char[header.get_length()-12];
 					is.read(buff, header.get_length()-12);
-					delete buff;
+					delete[] buff;
 				}
 			}
 			else
diff --git a/Utilities/otbossimplugins/ossim/RadarSat/Data/DataFactory.cpp b/Utilities/otbossimplugins/ossim/RadarSat/Data/DataFactory.cpp
index 94de79938a..9889547dfd 100644
--- a/Utilities/otbossimplugins/ossim/RadarSat/Data/DataFactory.cpp
+++ b/Utilities/otbossimplugins/ossim/RadarSat/Data/DataFactory.cpp
@@ -25,6 +25,17 @@ DataFactory::DataFactory()
 
 DataFactory::~DataFactory()
 {
+  std::map<int, RadarSatRecord*>::iterator i = _availableRecords.begin();
 
+  while (i != _availableRecords.end())
+  {
+     if ( (*i).second )
+     {
+        delete (*i).second;
+        (*i).second = 0;
+     }
+     ++i;
+  }
+  _availableRecords.clear();
 }
 }
diff --git a/Utilities/otbossimplugins/ossim/RadarSat/Data/ProcessedDataRecord.h b/Utilities/otbossimplugins/ossim/RadarSat/Data/ProcessedDataRecord.h
index c1fbb8492c..0ac120eeff 100644
--- a/Utilities/otbossimplugins/ossim/RadarSat/Data/ProcessedDataRecord.h
+++ b/Utilities/otbossimplugins/ossim/RadarSat/Data/ProcessedDataRecord.h
@@ -412,6 +412,9 @@ private:
         res[nb_octets-1-i] = buffer[i];
       }
       memcpy(&value,res,nb_octets);
+
+      free(buffer);
+      free(res);
     }
   }
 };
diff --git a/Utilities/otbossimplugins/ossim/RadarSat/Leader/Leader.cpp b/Utilities/otbossimplugins/ossim/RadarSat/Leader/Leader.cpp
index 309c0c15bc..9313d5e867 100644
--- a/Utilities/otbossimplugins/ossim/RadarSat/Leader/Leader.cpp
+++ b/Utilities/otbossimplugins/ossim/RadarSat/Leader/Leader.cpp
@@ -86,7 +86,7 @@ std::istream& operator>>(std::istream& is, Leader& data)
 			{
 				char* buff = new char[header.get_length()-12];
 				is.read(buff, header.get_length()-12);
-				delete buff;
+				delete[] buff;
 			}
 		}
 	}
diff --git a/Utilities/otbossimplugins/ossim/RadarSat/Leader/LeaderFactory.cpp b/Utilities/otbossimplugins/ossim/RadarSat/Leader/LeaderFactory.cpp
index c2cbf1888f..3b5bd1cded 100644
--- a/Utilities/otbossimplugins/ossim/RadarSat/Leader/LeaderFactory.cpp
+++ b/Utilities/otbossimplugins/ossim/RadarSat/Leader/LeaderFactory.cpp
@@ -41,5 +41,18 @@ LeaderFactory::LeaderFactory()
 LeaderFactory::~LeaderFactory()
 {
 
+  std::map<int, RadarSatRecord*>::iterator i = _availableRecords.begin();
+
+  while (i != _availableRecords.end())
+  {
+     if ( (*i).second )
+     {
+        delete (*i).second;
+        (*i).second = 0;
+     }
+     ++i;
+  }
+  _availableRecords.clear();
+
 }
 }
diff --git a/Utilities/otbossimplugins/ossim/ossimRadarSat2Model.cpp b/Utilities/otbossimplugins/ossim/ossimRadarSat2Model.cpp
index 19b24dd7d0..9287177efa 100644
--- a/Utilities/otbossimplugins/ossim/ossimRadarSat2Model.cpp
+++ b/Utilities/otbossimplugins/ossim/ossimRadarSat2Model.cpp
@@ -502,7 +502,8 @@ bool ossimRadarSat2Model::InitRefPoint(const ossimKeywordlist &kwl,
       date->set_second((int) floor(time)) ;
       date->set_decimal(time - floor(time)) ;
    }
-
+   delete date;//FIXME to confirm
+  
    if(_platformPosition != 0)
    {
       Ephemeris * ephemeris = _platformPosition->Interpolate((JSDDateTime)*date);
diff --git a/Utilities/otbossimplugins/ossim/ossimRadarSatModel.cpp b/Utilities/otbossimplugins/ossim/ossimRadarSatModel.cpp
index cd57925598..fb09615bce 100644
--- a/Utilities/otbossimplugins/ossim/ossimRadarSatModel.cpp
+++ b/Utilities/otbossimplugins/ossim/ossimRadarSatModel.cpp
@@ -53,6 +53,16 @@ ossimRadarSatModel::ossimRadarSatModel():
 
 ossimRadarSatModel::~ossimRadarSatModel()
 {
+  if (_data != 0)
+  {
+    delete _data;
+  }
+
+  if (_leader != 0)
+  {
+    delete _leader;
+  }
+  
 }
 
 ossimObject* ossimRadarSatModel::dup() const
@@ -623,9 +633,12 @@ bool ossimRadarSatModel::InitPlatformPosition(const ossimKeywordlist &kwl, const
     ephemeris[i] = eph;
 
     delete tmpEphemeris;
+    delete greenwich_mha;
 
   }
 
+  delete greenwich_mha_ref2000;
+
   /*
    * Antenna position interpolator creation
    */
-- 
GitLab