From 8bf083146d4bb082ba6af10fda903fc231789661 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 21 Jan 2020 10:58:56 +0000 Subject: [PATCH] EgtGeomKernel 2.2a5 : - corretta GdbObj::CopyAttribsFrom per mancata liberazione memoria prima di nuova assegnazione - riportata la stessa correzione in GdbObj::CopyTextureDataFrom e GdbObj::CopyUserObjFrom - corretta GeomDB::CopyAllInfoFrom per verificare e garantire allocazione Attribs. --- Attribs.h | 2 +- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes GdbObj.cpp | 38 ++++++++++++++------------------------ GeomDB.cpp | 6 ++++-- 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/Attribs.h b/Attribs.h index 7f332ae..de11e99 100644 --- a/Attribs.h +++ b/Attribs.h @@ -37,7 +37,7 @@ class Attribs Attribs* Clone( void) const { Attribs* pAttribs ; // alloco oggetto - pAttribs = new(std::nothrow) Attribs ; + pAttribs = new( std::nothrow) Attribs ; if ( pAttribs != nullptr) *pAttribs = *this ; return pAttribs ; } diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index d072b1ecc486fe5e1e87be4f06e2e341e6668200..ae645e68a3e7cdb29fc3cd91afb377cc121f5415 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&Qg&A-_cnHfzdD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-X4V@L delta 94 zcmdlNy)SyhFE&P#&A-_cnHfzcD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-WjGrO diff --git a/GdbObj.cpp b/GdbObj.cpp index 6bf4aaa..ff3620d 100644 --- a/GdbObj.cpp +++ b/GdbObj.cpp @@ -101,6 +101,10 @@ GdbObj::CopyAttribsFrom( const GdbObj* pSou) // se l'oggetto sorgente non esiste if ( pSou == nullptr) return false ; + // cancello gli attributi originali + if ( m_pAttribs != nullptr) + delete m_pAttribs ; + m_pAttribs = nullptr ; // copio gli attributi if ( pSou->m_pAttribs != nullptr) { m_pAttribs = pSou->m_pAttribs->Clone() ; @@ -112,12 +116,6 @@ GdbObj::CopyAttribsFrom( const GdbObj* pSou) // marcatura sempre disabilitata m_pAttribs->ResetMark() ; } - // altrimenti li cancello - else { - if ( m_pAttribs != nullptr) - delete m_pAttribs ; - m_pAttribs = nullptr ; - } return true ; } @@ -129,18 +127,16 @@ GdbObj::CopyTextureDataFrom( const GdbObj* pSou) // se l'oggetto sorgente non esiste if ( pSou == nullptr) return false ; + // cancello i dati di texture originali + if ( m_pTxrData != nullptr) + delete m_pTxrData ; + m_pTxrData = nullptr ; // copio texture data if ( pSou->m_pTxrData != nullptr) { m_pTxrData = pSou->m_pTxrData->Clone() ; if ( m_pTxrData == nullptr) return false ; } - // altrimenti li cancello - else { - if ( m_pTxrData != nullptr) - delete m_pTxrData ; - m_pTxrData = nullptr ; - } return true ; } @@ -152,6 +148,10 @@ GdbObj::CopyUserObjFrom( const GdbObj* pSou) // se l'oggetto sorgente non esiste if ( pSou == nullptr) return false ; + // copio UserObj originale + if ( m_pUserObj != nullptr) + delete m_pUserObj ; + m_pUserObj = nullptr ; // copio UserObj if ( pSou->m_pUserObj != nullptr) { m_pUserObj = pSou->m_pUserObj->Clone() ; @@ -159,12 +159,6 @@ GdbObj::CopyUserObjFrom( const GdbObj* pSou) return false ; m_pUserObj->SetOwner( m_nId, m_pGDB) ; } - // altrimenti lo cancello - else { - if ( m_pUserObj != nullptr) - delete m_pUserObj ; - m_pUserObj = nullptr ; - } return true ; } @@ -367,12 +361,8 @@ GdbObj::LoadAttribs( NgeReader& ngeIn) Attribs* GdbObj::GetSafeAttribs( void) { - if ( m_pAttribs == nullptr) { - Attribs* pAttribs = new( nothrow) Attribs ; - if ( pAttribs == nullptr) - return nullptr ; - m_pAttribs = pAttribs ; - } + if ( m_pAttribs == nullptr) + m_pAttribs = new( nothrow) Attribs ; return m_pAttribs ; } diff --git a/GeomDB.cpp b/GeomDB.cpp index bd83b27..920f964 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -2776,8 +2776,10 @@ GeomDB::CopyAllInfoFrom( int nId, int nSouId) return false ; // copio tutte le Info - if ( pGdbObj != pGdbObjSou && pGdbObjSou->m_pAttribs != nullptr) - return pGdbObj->m_pAttribs->CopyAllInfoFrom( *(pGdbObjSou->m_pAttribs)) ; + if ( pGdbObj != pGdbObjSou && pGdbObjSou->m_pAttribs != nullptr) { + pGdbObj->GetSafeAttribs() ; + return ( pGdbObj->m_pAttribs != nullptr && pGdbObj->m_pAttribs->CopyAllInfoFrom( *(pGdbObjSou->m_pAttribs))) ; + } else return true ; }