Changeset 957


Ignore:
Timestamp:
09/30/16 15:28:05 (5 years ago)
Author:
rlacroix
Message:

Fix a possible crash caused by an infinite recursion.

The way virtual groups were handled could cause id clashes which lead to have groups containing themselves.

Location:
XIOS/trunk/src/node
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/field.cpp

    r952 r957  
    3737      , useCompressedOutput(false) 
    3838      , isReadDataRequestPending(false) 
    39    { setVirtualVariableGroup(); } 
     39   { setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); } 
    4040 
    4141   CField::CField(const StdString& id) 
     
    4848      , useCompressedOutput(false) 
    4949      , isReadDataRequestPending(false) 
    50    { setVirtualVariableGroup(); } 
     50   { setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); } 
    5151 
    5252   CField::~CField(void) 
     
    6060   } 
    6161 
    62    void CField::setVirtualVariableGroup(void) 
    63    { 
    64       this->setVirtualVariableGroup(CVariableGroup::create()); 
    65    } 
    66  
    6762   CVariableGroup* CField::getVirtualVariableGroup(void) const 
    6863   { 
    6964      return this->vVariableGroup; 
    7065   } 
    71  
    7266 
    7367   std::vector<CVariable*> CField::getAllVariables(void) const 
     
    12101204   void CField::sendAddAllVariables() 
    12111205   { 
    1212      if (!getAllVariables().empty()) 
    1213      { 
    1214        // Firstly, it's necessary to add virtual variable group 
    1215        sendAddVariableGroup(getVirtualVariableGroup()->getId()); 
    1216  
    1217        // Okie, now we can add to this variable group 
    1218        std::vector<CVariable*> allVar = getAllVariables(); 
    1219        std::vector<CVariable*>::const_iterator it = allVar.begin(); 
    1220        std::vector<CVariable*>::const_iterator itE = allVar.end(); 
    1221  
    1222        for (; it != itE; ++it) 
    1223        { 
    1224          this->sendAddVariable((*it)->getId()); 
    1225          (*it)->sendAllAttributesToServer(); 
    1226          (*it)->sendValue(); 
    1227        } 
     1206     std::vector<CVariable*> allVar = getAllVariables(); 
     1207     std::vector<CVariable*>::const_iterator it = allVar.begin(); 
     1208     std::vector<CVariable*>::const_iterator itE = allVar.end(); 
     1209 
     1210     for (; it != itE; ++it) 
     1211     { 
     1212       this->sendAddVariable((*it)->getId()); 
     1213       (*it)->sendAllAttributesToServer(); 
     1214       (*it)->sendValue(); 
    12281215     } 
    12291216   } 
  • XIOS/trunk/src/node/field.hpp

    r952 r957  
    161161 
    162162        void setVirtualVariableGroup(CVariableGroup* newVVariableGroup); 
    163         void setVirtualVariableGroup(void); 
    164163        CVariableGroup* getVirtualVariableGroup(void) const; 
    165164        vector<CVariable*> getAllVariables(void) const; 
  • XIOS/trunk/src/node/file.cpp

    r952 r957  
    2626      , allDomainEmpty(false), isOpen(false) 
    2727   { 
    28      setVirtualFieldGroup(); 
    29      setVirtualVariableGroup(); 
     28     setVirtualFieldGroup(CFieldGroup::create(getId() + "_virtual_field_group")); 
     29     setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); 
    3030   } 
    3131 
     
    3535      , allDomainEmpty(false), isOpen(false) 
    3636    { 
    37       setVirtualFieldGroup(); 
    38       setVirtualVariableGroup(); 
     37      setVirtualFieldGroup(CFieldGroup::create(getId() + "_virtual_field_group")); 
     38      setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); 
    3939    } 
    4040 
     
    187187   { 
    188188      this->vVariableGroup = newVVariableGroup; 
    189    } 
    190  
    191    //---------------------------------------------------------------- 
    192    //! Create virtual field group, which is done normally on initializing file 
    193    void CFile::setVirtualFieldGroup(void) 
    194    { 
    195       this->setVirtualFieldGroup(CFieldGroup::create()); 
    196    } 
    197  
    198    //! Create virtual variable group, which is done normally on initializing file 
    199    void CFile::setVirtualVariableGroup(void) 
    200    { 
    201       this->setVirtualVariableGroup(CVariableGroup::create()); 
    202189   } 
    203190 
     
    944931   void CFile::sendAddAllVariables() 
    945932   { 
    946      if (!getAllVariables().empty()) 
     933     std::vector<CVariable*> allVar = getAllVariables(); 
     934     std::vector<CVariable*>::const_iterator it = allVar.begin(); 
     935     std::vector<CVariable*>::const_iterator itE = allVar.end(); 
     936 
     937     for (; it != itE; ++it) 
    947938     { 
    948        // Firstly, it's necessary to add virtual variable group 
    949        sendAddVariableGroup(getVirtualVariableGroup()->getId()); 
    950  
    951        // Okie, now we can add to this variable group 
    952        std::vector<CVariable*> allVar = getAllVariables(); 
    953        std::vector<CVariable*>::const_iterator it = allVar.begin(); 
    954        std::vector<CVariable*>::const_iterator itE = allVar.end(); 
    955  
    956        for (; it != itE; ++it) 
    957        { 
    958          this->sendAddVariable((*it)->getId()); 
    959          (*it)->sendAllAttributesToServer(); 
    960          (*it)->sendValue(); 
    961        } 
     939       this->sendAddVariable((*it)->getId()); 
     940       (*it)->sendAllAttributesToServer(); 
     941       (*it)->sendValue(); 
    962942     } 
    963943   } 
  • XIOS/trunk/src/node/file.hpp

    r878 r957  
    9292         // Set some root definitions in a file 
    9393         void setVirtualFieldGroup(CFieldGroup* newVFieldGroup); 
    94          void setVirtualFieldGroup(void); 
    9594         void setVirtualVariableGroup(CVariableGroup* newVVariableGroup); 
    96          void setVirtualVariableGroup(void); 
    9795 
    9896         void createHeader(void); 
  • XIOS/trunk/src/node/grid.cpp

    r943 r957  
    3636      , gridSrc_(), hasTransform_(false), isGenerated_(false), order_(), globalIndexOnServer_() 
    3737   { 
    38      setVirtualDomainGroup(); 
    39      setVirtualAxisGroup(); 
    40      setVirtualScalarGroup(); 
     38     setVirtualDomainGroup(CDomainGroup::create(getId() + "_virtual_domain_group")); 
     39     setVirtualAxisGroup(CAxisGroup::create(getId() + "_virtual_axis_group")); 
     40     setVirtualScalarGroup(CScalarGroup::create(getId() + "_virtual_scalar_group")); 
    4141   } 
    4242 
     
    5454      , gridSrc_(), hasTransform_(false), isGenerated_(false), order_(), globalIndexOnServer_() 
    5555   { 
    56      setVirtualDomainGroup(); 
    57      setVirtualAxisGroup(); 
    58      setVirtualScalarGroup(); 
     56     setVirtualDomainGroup(CDomainGroup::create(getId() + "_virtual_domain_group")); 
     57     setVirtualAxisGroup(CAxisGroup::create(getId() + "_virtual_axis_group")); 
     58     setVirtualScalarGroup(CScalarGroup::create(getId() + "_virtual_scalar_group")); 
    5959   } 
    6060 
     
    14821482   } 
    14831483 
    1484    //---------------------------------------------------------------- 
    1485    //! Create virtual field group, which is done normally on initializing file 
    1486    void CGrid::setVirtualDomainGroup(void) 
    1487    { 
    1488       this->setVirtualDomainGroup(CDomainGroup::create()); 
    1489    } 
    1490  
    1491    //! Create virtual variable group, which is done normally on initializing file 
    1492    void CGrid::setVirtualAxisGroup(void) 
    1493    { 
    1494       this->setVirtualAxisGroup(CAxisGroup::create()); 
    1495    } 
    1496  
    1497    //! Create virtual variable group, which is done normally on initializing file 
    1498    void CGrid::setVirtualScalarGroup(void) 
    1499    { 
    1500       this->setVirtualScalarGroup(CScalarGroup::create()); 
    1501    } 
    1502  
    15031484   /*! 
    15041485   \brief Send a message to create a domain on server side 
  • XIOS/trunk/src/node/grid.hpp

    r955 r957  
    244244 
    245245        void setVirtualDomainGroup(CDomainGroup* newVDomainGroup); 
    246         void setVirtualDomainGroup(); 
    247246        void setVirtualAxisGroup(CAxisGroup* newVAxisGroup); 
    248         void setVirtualAxisGroup(); 
    249247        void setVirtualScalarGroup(CScalarGroup* newVScalarGroup); 
    250         void setVirtualScalarGroup(); 
    251248 
    252249        void setDomainList(const std::vector<CDomain*> domains = std::vector<CDomain*>()); 
Note: See TracChangeset for help on using the changeset viewer.