Changeset 157

Show
Ignore:
Timestamp:
07/11/08 10:13:00 (6 months ago)
Author:
zork
Message:

mem corruption when variable was binded to field out of bounds

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/dba/dba/csv.cpp

    r122 r157  
    317317}; 
    318318 
    319 #ifdef DBA_COMPAT_1_0     
     319#ifdef DBA_COMPAT_1_0 
    320320CSVIStream*  
    321321CSVArchive::getOIStream() { 
     
    644644//  for(list<string>::const_iterator it = mValues.begin(); it != mValues.end(); it++) cerr << "val:" << *it << endl; 
    645645  const StoreTable* tbl = Stream::getTable(*pObject); 
    646   std::string data; 
    647   const char* current_table_name = tbl->getTableName(); 
    648   if (current_table_name == NULL) 
    649     throw APIException("Root table has no name"); 
    650   while(tbl != NULL) { 
    651     if (tbl->getTableName() != NULL) 
    652       current_table_name = tbl->getTableName(); 
    653     StoreTableMember* member = tbl->getMembers(); 
    654     while (member != NULL) { 
    655 //      cerr << "setting member " << member -> name << " binded to " << member << endl; 
    656       unsigned int pos = getMappingPosByName(mMappings, current_table_name, member->getMemberName()); 
    657       dba::StoreableFilterBase* filter(member->getFilter()); 
    658       setFilterPtr(*filter,(char*)pObject + (int)(member->getMemberOffset() + tbl->getClassOffset())); 
    659       if (pos != (unsigned)-1) { 
    660         //we got mapping for column but we cannot find  
    661         //that column data in csv file 
    662         if (mValues.size() <= pos) { 
    663           string s; 
    664           s += "Column " + dba::toStr(pos) + " for mapping " +  current_table_name + "." + member->getMemberName() + " not found "; 
    665           throw DataException(s); 
     646  if (tbl != NULL) { 
     647    std::string data; 
     648    const char* current_table_name = tbl->getTableName(); 
     649    if (current_table_name == NULL) 
     650      throw APIException("Root table has no name"); 
     651    while(tbl != NULL) { 
     652      if (tbl->getTableName() != NULL) 
     653        current_table_name = tbl->getTableName(); 
     654      StoreTableMember* member = tbl->getMembers(); 
     655      while (member != NULL) { 
     656  //      cerr << "setting member " << member -> name << " binded to " << member << endl; 
     657        unsigned int pos = getMappingPosByName(mMappings, current_table_name, member->getMemberName()); 
     658        dba::StoreableFilterBase* filter(member->getFilter()); 
     659        setFilterPtr(*filter,(char*)pObject + (int)(member->getMemberOffset() + tbl->getClassOffset())); 
     660        if (pos != (unsigned)-1) { 
     661          //we got mapping for column but we cannot find  
     662          //that column data in csv file 
     663          if (mValues.size() <= pos) { 
     664            string s; 
     665            s += "Column " + dba::toStr(pos) + " for mapping " +  current_table_name + "." + member->getMemberName() + " not found "; 
     666            throw DataException(s); 
     667          }; 
     668          data = getValueByIndex(mValues, pos); 
     669          filter->fromString(mConvSpecs, data); 
     670        } else { 
     671          data.erase(); 
     672          filter->fromNull(); 
    666673        }; 
    667         data = getValueByIndex(mValues, pos); 
    668         filter->fromString(mConvSpecs, data); 
    669       } else { 
    670         data.erase(); 
    671         filter->fromNull(); 
     674        member = member->getNextMember(); 
    672675      }; 
    673       member = member->getNextMember(); 
    674     }; 
    675     tbl = tbl->getNextTable(); 
    676   }; 
    677   list<mapping>::iterator mit = find_if(mMappings.begin(), mMappings.end(), mappingMatcher("id")); 
    678   if (mit != mMappings.end()) { 
    679     if (mit -> fnumber != -1) { 
    680       data = getValueByIndex(mValues, mit -> fnumber); 
    681       int id; 
    682       dba::convert(data,id); 
    683       Stream::alterId(pObject,id); 
    684       Stream::makeOk(pObject); 
     676      tbl = tbl->getNextTable(); 
     677    }; 
     678    list<mapping>::iterator mit = find_if(mMappings.begin(), mMappings.end(), mappingMatcher("id")); 
     679    if (mit != mMappings.end()) { 
     680      if (mit -> fnumber != -1) { 
     681        data = getValueByIndex(mValues, mit -> fnumber); 
     682        int id; 
     683        dba::convert(data,id); 
     684        Stream::alterId(pObject,id); 
     685        Stream::makeOk(pObject); 
     686      }; 
    685687    }; 
    686688  }; 
     
    720722}; 
    721723 
    722  
    723724void 
    724725CSVIStream::close() { 
     
    727728}; 
    728729 
    729 string 
    730 CSVIStream::getValueByIndex(const list<string>& pValue, int pPos) { 
     730std::string 
     731CSVIStream::getValueByIndex(const list<std::string>& pValue, int pPos) { 
    731732  list<string>::const_iterator it = pValue.begin(); 
    732733  int i = 0; 
     
    737738    it++; 
    738739  }; 
    739   return NULL; 
     740  std::string err("Field index"); 
     741  err += pPos; 
     742  err += " is out of bounds"; 
     743  throw DataException(err.c_str()); 
     744  //unreachable code 
     745  return std::string(); 
    740746}; 
    741747 
  • trunk/dba/test/csvtestcase.cpp

    r41 r157  
    486486}; 
    487487 
     488void 
     489CSVTestCase::invalidPos() { 
     490  const char* data =  
     491"1,2"; 
     492  {  
     493    unlink("invalid_pos.csv"); 
     494    std::ofstream file("invalid_pos.csv"); 
     495    file << data; 
     496  };   
     497  dba::CSVArchive ar; 
     498  ar.hasColumnNames(false); 
     499  ar.addMapping(0,"test","a"); 
     500  ar.addMapping(1,"test","b"); 
     501  ar.addMapping(2,"test","str"); 
     502  ar.open("invalid_pos.csv"); 
     503 
     504  std::string binded; 
     505 
     506  dba::CSVIStream istream = ar.getIStream(); 
     507  istream.bind("test", "str", new dba::String(binded)); 
     508  dba::Storeable t; 
     509  istream.open(t); 
     510  try { 
     511    istream.getNext(&t); 
     512    CPPUNIT_ASSERT_MESSAGE("no exception on missing mapping",false); 
     513  } catch (const dba::DataException& pEx) { 
     514    //test passed 
     515  }; 
     516}; 
     517 
    488518};//namespace 
    489519 
  • trunk/dba/test/csvtestcase.h

    r20 r157  
    5151      CPPUNIT_TEST(sepTest); 
    5252      CPPUNIT_TEST(autoBindedVars); 
     53      CPPUNIT_TEST(invalidPos); 
    5354  CPPUNIT_TEST_SUITE_END(); 
    5455 
     
    6768    void openNonCSVFileForWriteTest2(); 
    6869    void spaceSeparator(); 
     70    void invalidPos(); 
    6971  private: 
    7072    class CSVTester : public dba::Storeable { 
  • trunk/dba/test/main.cpp

    r156 r157  
    144144  CppUnit::BriefTestProgressListener listener; 
    145145  runner.eventManager().addListener(&listener); 
    146   runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); 
     146  //runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() ); 
    147147  //runner.addTest(new CppUnit::TestCaller<SQLite3SQLArchiveTestCase>("debug_test",&SQLite3SQLArchiveTestCase::sqlError)); 
    148148  //runner.addTest(new CppUnit::TestCaller<PostgresSQLArchiveTestCase>("debug_test",&PostgresSQLArchiveTestCase::sqlError)); 
    149149  //runner.addTest(new CppUnit::TestCaller<dba_tests::StringFilter>("debug_test",&dba_tests::StringFilter::test17)); 
    150   //runner.addTest(new CppUnit::TestCaller<dba_tests::CSVTestCase>("debug_test",&dba_tests::CSVTestCase::manual)); 
     150  runner.addTest(new CppUnit::TestCaller<dba_tests::CSVTestCase>("debug_test",&dba_tests::CSVTestCase::invalidPos)); 
    151151  //runner.addTest(new CppUnit::TestCaller<SQLite3SQLArchiveTestCase>("debug_test",&SQLite3SQLArchiveTestCase::transactions_rollback)); 
    152152  //runner.addTest(dba_tests::XMLTestCase::suite());