From c454b5c75ceb0c447ce0d94837dc008c910eda4d Mon Sep 17 00:00:00 2001
From: Xavier Robin <xavier.robin@unibas.ch>
Date: Wed, 26 Jul 2023 17:05:33 +0200
Subject: [PATCH] fix: SCHWED-4345 check pointers before returning

This checks whether the underlying handles are still valid before
returning pointers to them. Runs the check each time CheckValidity
is called on atom, residue and chain handles.
---
 modules/mol/base/src/atom_base.cc         | 2 +-
 modules/mol/base/src/chain_base.cc        | 2 +-
 modules/mol/base/src/impl/atom_impl.cc    | 6 ++++++
 modules/mol/base/src/impl/chain_impl.cc   | 3 +++
 modules/mol/base/src/impl/residue_impl.cc | 6 ++++++
 modules/mol/base/src/residue_base.cc      | 2 +-
 6 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/modules/mol/base/src/atom_base.cc b/modules/mol/base/src/atom_base.cc
index b1547fb51..482464768 100644
--- a/modules/mol/base/src/atom_base.cc
+++ b/modules/mol/base/src/atom_base.cc
@@ -104,7 +104,7 @@ String AtomBase::GetQualifiedName() const
 
 void AtomBase::CheckValidity() const 
 {
-  if (!impl_)
+  if (! (impl_ && impl_->GetEntity()))
     throw InvalidHandle();
 }
 
diff --git a/modules/mol/base/src/chain_base.cc b/modules/mol/base/src/chain_base.cc
index 2b693b7fc..28263e738 100644
--- a/modules/mol/base/src/chain_base.cc
+++ b/modules/mol/base/src/chain_base.cc
@@ -53,7 +53,7 @@ String ChainBase::GetDescription() const {
 }
 
 void ChainBase::CheckValidity() const {
-  if (!impl_)
+  if (! (impl_ && impl_->GetEntity()))
     throw InvalidHandle();
 }
 
diff --git a/modules/mol/base/src/impl/atom_impl.cc b/modules/mol/base/src/impl/atom_impl.cc
index 9c5642eaf..2e754a73b 100644
--- a/modules/mol/base/src/impl/atom_impl.cc
+++ b/modules/mol/base/src/impl/atom_impl.cc
@@ -73,6 +73,9 @@ void AtomImpl::Apply(EntityVisitor& v)
 
 ResidueImplPtr AtomImpl::GetResidue() const
 {
+  if (!res_.lock()) {
+    throw InvalidHandle();
+  }
   return res_.lock();
 }
 
@@ -214,6 +217,9 @@ AtomImpl::~AtomImpl() {
 
 EntityImplPtr AtomImpl::GetEntity() const
 {
+  if (!res_.lock()) {
+    throw InvalidHandle();
+  }
   return res_.lock()->GetEntity();
 }
 
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index adf5aeb8b..6aff6305b 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -369,6 +369,9 @@ AtomImplPtr ChainImpl::FindAtom(const ResNum& num,
 
 EntityImplPtr ChainImpl::GetEntity() const 
 {
+  if (!ent_.lock()) {
+    throw InvalidHandle();
+  }
   return ent_.lock();
 }
 int ChainImpl::GetIndexForResNum(const ResNum& number) const
diff --git a/modules/mol/base/src/impl/residue_impl.cc b/modules/mol/base/src/impl/residue_impl.cc
index 819c7294d..316f16de2 100644
--- a/modules/mol/base/src/impl/residue_impl.cc
+++ b/modules/mol/base/src/impl/residue_impl.cc
@@ -200,6 +200,9 @@ void ResidueImpl::SetSecStructure(SecStructure ss)
 
 EntityImplPtr ResidueImpl::GetEntity() const
 {
+  if (!ent_.lock()) {
+    throw InvalidHandle();
+  }
   return ent_.lock();
 }
 
@@ -256,6 +259,9 @@ int ResidueImpl::GetBondCount() const
 
 ChainImplPtr ResidueImpl::GetChain() const
 {
+  if (!chain_.lock()) {
+    throw InvalidHandle();
+  }
   return chain_.lock();
 }
 
diff --git a/modules/mol/base/src/residue_base.cc b/modules/mol/base/src/residue_base.cc
index b788d7c2e..01b996679 100644
--- a/modules/mol/base/src/residue_base.cc
+++ b/modules/mol/base/src/residue_base.cc
@@ -158,7 +158,7 @@ const impl::ResidueImplPtr& ResidueBase::Impl() const
 
 void ResidueBase::CheckValidity() const 
 {
-  if (!impl_)
+  if (! (impl_ && impl_->GetEntity()))
     throw InvalidHandle();
 }
 
-- 
GitLab