From ea127b5382f461b56ca82f1c562e6fcfcbac8dea Mon Sep 17 00:00:00 2001
From: juergen <juergen.haas@unibas.ch>
Date: Fri, 2 Dec 2011 15:03:11 +0100
Subject: [PATCH] BZDN-291: fixing segfault on erroneous COMPND records

---
 modules/io/src/mol/pdb_reader.cc        | 21 +++++++++++----
 modules/io/tests/test_io_pdb.cc         | 36 +++++++++++++------------
 modules/io/tests/testfiles/pdb/1oax.pdb | 24 +++++++++++++++++
 modules/io/tests/testfiles/pdb/2p6a.pdb | 25 +++++++++++++++++
 4 files changed, 84 insertions(+), 22 deletions(-)
 create mode 100644 modules/io/tests/testfiles/pdb/1oax.pdb
 create mode 100644 modules/io/tests/testfiles/pdb/2p6a.pdb

diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc
index 850556679..3d7bd3756 100644
--- a/modules/io/src/mol/pdb_reader.cc
+++ b/modules/io/src/mol/pdb_reader.cc
@@ -150,11 +150,22 @@ void PDBReader::ParseCompndEntry (const StringRef& line, int line_num)
   }
   if((entry.find(':')!=entry.end())){
     std::vector<StringRef> fields=entry.split(':');
-    key=fields[0].trim();
-    old_key_=key.str();
-    data=fields[1].trim();
+      key=fields[0].trim();
+      old_key_=key.str();
+    if (fields.size()>1) {
+      data=fields[1].trim();
+    }
+
 
     if(data.size()<1){
+      if (!(key.str()=="MOL_ID")&&!(key.str()=="CHAIN")){
+        LOG_WARNING("skipping unsupported COMPND record on line " << line_num<< ": record value"<< key.str()<<" too small");
+        if (data_continues_) {
+          skip_next_=true;
+        } else {
+          return;
+        }
+      }
       ThrowFaultTolerant(str(format("invalid COMPND record on line %d, record after ':' too small")%line_num));
     }
     data_continues_=true;
@@ -182,7 +193,7 @@ void PDBReader::ParseCompndEntry (const StringRef& line, int line_num)
   } 
       //currently only these are parsed
   if (!(key.str()=="MOL_ID")&&!(key.str()=="CHAIN")){
-    LOG_TRACE("reading COMPND record on line " << line_num<< "is not supported");
+    LOG_INFO("reading COMPND record on line " << line_num<< "is not supported");
     if (data_continues_) {
       skip_next_=true;
     } else {
@@ -474,7 +485,7 @@ void PDBReader::AssignMolIds(mol::EntityHandle ent) {
         if (chain) {
           chain.SetIntProp("mol_id", compnd_iterator->mol_id);
         }else{
-          std::cout << "failedchain: "<<*chain_iterator <<":: "<<std::endl;
+          std::cout << "failed to assign MOL_ID to chain: "<<*chain_iterator <<std::endl;
 
           std::stringstream ss;
           ss << "could not map COMPND record MOL_ID onto chain";
diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc
index fbf45c67a..5bbfbf699 100644
--- a/modules/io/tests/test_io_pdb.cc
+++ b/modules/io/tests/test_io_pdb.cc
@@ -139,26 +139,28 @@ BOOST_AUTO_TEST_CASE(test_parse_compnd_record5)
   PDBReader reader(fname, IOProfile()); 
   mol::EntityHandle ent=mol::CreateEntity();
   
-  BOOST_CHECK_THROW(reader.Import(ent), IOException);
+  BOOST_CHECK_NO_THROW(reader.Import(ent));
+  
+  mol::ChainHandle ch = ent.FindChain("A");
+  BOOST_CHECK(ch.HasProp("mol_id")==true);
+  BOOST_CHECK(ch.GetIntProp("mol_id")==1);
+  
+  ch = ent.FindChain("B");
+  BOOST_CHECK(ch.HasProp("mol_id")==false);
 }
 
+//chain I in MOL_ID record but no chain I
+BOOST_AUTO_TEST_CASE(test_parse_compnd_record6) 
+{
+  String fname("testfiles/pdb/1oax.pdb");
+  PDBReader reader(fname, IOProfile()); 
+  mol::EntityHandle ent=mol::CreateEntity();
+  
+  BOOST_CHECK_THROW(reader.Import(ent), IOException);
+  
+}
 
-//~ BOOST_AUTO_TEST_CASE(test_parse_compnd_record6) 
-//~ {
-  //~ String fname("testfiles/pdb/1oax.pdb");
-  //~ PDBReader reader(fname, IOProfile()); 
-  //~ mol::EntityHandle ent=mol::CreateEntity();
-  //~ 
-  //~ reader.Import(ent);
-  //~ mol::ChainHandle ch = ent.FindChain("I");
-  //~ BOOST_CHECK(ch.HasProp("mol_id")==true);
-  //~ BOOST_CHECK(ch.GetIntProp("mol_id")==1);
-//~ 
-  //~ ch = ent.FindChain("L");
-  //~ BOOST_CHECK(ch.HasProp("mol_id")==true);
-  //~ BOOST_CHECK(ch.GetIntProp("mol_id")==2);
-//~ }
-
+// has an empy MOLECULE record (unsupported ATM anyway, but crashed ost)
 BOOST_AUTO_TEST_CASE(test_parse_compnd_record7) 
 {
   String fname("testfiles/pdb/2p6a.pdb");
diff --git a/modules/io/tests/testfiles/pdb/1oax.pdb b/modules/io/tests/testfiles/pdb/1oax.pdb
new file mode 100644
index 000000000..8a61950e8
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/1oax.pdb
@@ -0,0 +1,24 @@
+
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: IMMUNOGLOBULIN E;                                          
+COMPND   3 CHAIN: H, I, J, K;                                                   
+COMPND   4 FRAGMENT: FV REGION, RESIDUES 1-122;                                 
+COMPND   5 ENGINEERED: YES;                                                     
+COMPND   6 MOL_ID: 2;                                                           
+COMPND   7 MOLECULE: IMMUNOGLOBULIN E;                                          
+COMPND   8 CHAIN: L, M, N, O;                                                   
+COMPND   9 FRAGMENT: FV REGION, RESIDUES 1-110;                                 
+COMPND  10 ENGINEERED: YES                       
+
+ATOM    961  CB  ALA H 122      24.405  78.113 110.762  1.00 46.85           C  
+TER     962      ALA H 122                                                      
+ATOM   1923  CB  ALA J 122     -18.810  34.607  14.909  1.00 46.23           C  
+TER    1924      ALA J 122                                                      
+ATOM   2722  CD2 LEU L 109      61.832  51.079 106.030  1.00 43.23           C  
+TER    2723      LEU L 109                                                      
+ATOM   3521  CD2 LEU M 109       2.184  -0.589  68.108  1.00 43.23           C  
+TER    3522      LEU M 109                                                      
+ATOM   4320  CD2 LEU N 109       7.889  -2.865  19.656  1.00 43.22           C  
+TER    4321      LEU N 109                                                      
+ATOM   5113  CD2 LEU O 109      59.692  56.678  57.399  1.00 43.23           C  
+TER    5114      LEU O 109                                                      
diff --git a/modules/io/tests/testfiles/pdb/2p6a.pdb b/modules/io/tests/testfiles/pdb/2p6a.pdb
new file mode 100644
index 000000000..19935ba86
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/2p6a.pdb
@@ -0,0 +1,25 @@
+COMPND    MOL_ID: 1;                                                            
+COMPND   2 MOLECULE: INHIBIN BETA A CHAIN;                                      
+COMPND   3 CHAIN: A, B;                                                         
+COMPND   4 SYNONYM: ACTIVIN BETA-A CHAIN, ERYTHROID DIFFERENTIATION             
+COMPND   5 PROTEIN, EDF;                                                        
+COMPND   6 ENGINEERED: YES;                                                     
+COMPND   7 MOL_ID: 2;                                                           
+COMPND   8 MOLECULE: FOLLISTATIN;                                               
+COMPND   9 CHAIN: D, C;                                                         
+COMPND  10 SYNONYM: FS, ACTIVIN-BINDING PROTEIN;                                
+COMPND  11 ENGINEERED: YES;                                                     
+COMPND  12 MOL_ID: 3;                                                           
+COMPND  13 MOLECULE:;                                                           
+COMPND  14 CHAIN: E;                                                            
+COMPND  15 ENGINEERED: YES
+ATOM    882  OXT SER A 116      15.399  37.353  44.611  1.00 73.37           O  
+TER     883      SER A 116                                                      
+ATOM   3870  OXT SER B 116      13.780  40.357  30.274  1.00 27.95           O  
+TER    3871      SER B 116                                                      
+ATOM   2987  OE2 GLU D 299      33.348  36.499   4.332  1.00 81.88           O  
+TER    2988      GLU D 299                                                      
+ATOM   5905  CB  ILE C 290      46.026  -9.354  55.435  1.00233.79           C  
+TER    5906      ILE C 290                                                      
+ATOM   5956  CB  ALA E  10      30.651  13.129  53.296  1.00191.07           C  
+TER    5957      ALA E  10  
-- 
GitLab