Fix bug in PDB destructor 63/4263/1
authorJim Phillips <jim@ks.uiuc.edu>
Thu, 14 Jun 2018 17:20:57 +0000 (12:20 -0500)
committerJim Phillips <jim@ks.uiuc.edu>
Thu, 14 Jun 2018 17:20:57 +0000 (12:20 -0500)
Array of pointers sometimes pointed to independently
allocated elements and sometimes to elements of an array.
Destructor would call delete [] if elements were
contiguous in memory, which could happen by coincidence.
Now independently tracks how data was allocated.

Bug reported on Mac by J.C. Gumbart.

Change-Id: I22c6a2c0a37d208913a73b83cd76098afc412778

src/PDB.C
src/PDB.h

index fb22ffc..bdc5ef6 100644 (file)
--- a/src/PDB.C
+++ b/src/PDB.C
@@ -106,7 +106,7 @@ PDB::PDB(molfile_plugin_t *pIOHdl, void *pIOFileHdl, int numAtoms, const float *
 
   //load coordinates to PDB object
   //Note: the PDBAtom structure is very redundant in this case
-  PDBAtom *tmpAtoms = new PDBAtom[numAtoms];
+  PDBAtom *tmpAtoms = atomAlloc = new PDBAtom[numAtoms];
   atomArray = new PDBAtomPtr[numAtoms];
   BigReal tmpCoords[3];
   for(int i=0; i<numAtoms; i++) {
@@ -214,6 +214,7 @@ PDB::PDB( const char *pdbfilename) {
      }
      atomListHead = atomListTail = NULL;
 #else
+  atomAlloc = 0;
   atomArray = new PDBAtomPtr[atomCount];
   if ( atomArray == NULL )
   {
@@ -242,8 +243,8 @@ PDB::~PDB( void )
 {
 #ifndef MEM_OPT_VERSION
        int i;
-       if ( atomArray[atomCount-1] == atomArray[0] + (atomCount-1) ) {
-         delete [] atomArray[0];
+       if ( atomAlloc ) {
+         delete [] atomAlloc;
        } else {
          for (i=atomCount-1; i>=0; i--)
            delete atomArray[i];
@@ -571,6 +572,7 @@ PDB::PDB( const char *filename, Ambertoppar *amber_data)
   altlocArray = 0;
   atomArray = new PDBCoreData[atomCount];
 #else
+  atomAlloc = 0;
   atomArray = new PDBAtomPtr[atomCount];
 #endif
 
@@ -649,6 +651,7 @@ PDB::PDB(const char *filename, const GromacsTopFile *topology) {
   altlocArray = 0;
   atomArray = new PDBCoreData[atomCount];
 #else
+  atomAlloc = 0;
   atomArray = new PDBAtomPtr[atomCount];
 #endif
   if ( atomArray == NULL )
index 1b2ac43..d176cde 100644 (file)
--- a/src/PDB.h
+++ b/src/PDB.h
@@ -41,6 +41,7 @@ class PDB {
     PDBCoreData *atomArray;
 #else
     PDBAtom **atomArray;
+    PDBAtom *atomAlloc;
 #endif
       // this doesn't create a copy 
     void add_atom_element(PDBAtom *newAtom);