From 27a9e574ef5ccb4d0f264504de14172c76711a1a Mon Sep 17 00:00:00 2001
From: Sergey Linev <S.Linev@gsi.de>
Date: Thu, 25 Mar 2021 15:44:51 +0100
Subject: [PATCH] [cppyy] fix potential double-deletion in CPPMethod #7692

After use of asign operator some fields can be destroyed twice
---
 bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.cxx | 7 ++++++-
 bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.h   | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.cxx b/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.cxx
index a1c0e94f6dc..c05ec97bded 100644
--- a/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.cxx
+++ b/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.cxx
@@ -45,7 +45,7 @@ inline void CPyCppyy::CPPMethod::Copy_(const CPPMethod& /* other */)
 }
 
 //----------------------------------------------------------------------------
-inline void CPyCppyy::CPPMethod::Destroy_() const
+inline void CPyCppyy::CPPMethod::Destroy_()
 {
 // destroy executor and argument converters
     if (fExecutor && fExecutor->HasState()) delete fExecutor;
@@ -55,6 +55,11 @@ inline void CPyCppyy::CPPMethod::Destroy_() const
     }
 
     delete fArgIndices;
+
+    fExecutor = nullptr;
+    fArgIndices = nullptr;
+    fConverters.clear();
+    fArgsRequired = -1;
 }
 
 //----------------------------------------------------------------------------
diff --git a/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.h b/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.h
index d29eae27b30..ddd8aa113dd 100644
--- a/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.h
+++ b/bindings/pyroot/cppyy/CPyCppyy/src/CPPMethod.h
@@ -61,7 +61,7 @@ protected:
 
 private:
     void Copy_(const CPPMethod&);
-    void Destroy_() const;
+    void Destroy_();
 
     PyObject* ExecuteFast(void*, ptrdiff_t, CallContext*);
     PyObject* ExecuteProtected(void*, ptrdiff_t, CallContext*);
-- 
GitLab