diff -ur ../openssl-1.0.0d/engines//ccgost/gost_ameth.c ./engines//ccgost/gost_ameth.c
--- ../openssl-1.0.0d/engines//ccgost/gost_ameth.c	2010-06-15 21:25:13.000000000 +0400
+++ ./engines//ccgost/gost_ameth.c	2011-09-11 16:12:12.000000000 +0400
@@ -860,6 +860,10 @@
 /* ----------------------------------------------------------------------*/
 int register_ameth_gost (int nid, EVP_PKEY_ASN1_METHOD **ameth, const char* pemstr, const char* info) 
 	{
+	if (*ameth)
+	{
+		EVP_PKEY_asn1_free(*ameth);
+	}
 	*ameth =	EVP_PKEY_asn1_new(nid, 
 		ASN1_PKEY_SIGPARAM_NULL, pemstr, info); 
 	if (!*ameth) return 0;
diff -ur ../openssl-1.0.0d/engines//ccgost/gost_eng.c ./engines//ccgost/gost_eng.c
--- ../openssl-1.0.0d/engines//ccgost/gost_eng.c	2008-03-17 00:05:44.000000000 +0300
+++ ./engines//ccgost/gost_eng.c	2011-09-11 16:14:16.000000000 +0400
@@ -62,8 +62,17 @@
 	}
 
 static int gost_engine_destroy(ENGINE *e)
-	{ 
+	{
+	pmeth_GostR3410_94 = NULL;
+	pmeth_GostR3410_2001 = NULL;
+	pmeth_Gost28147_MAC = NULL;
+
+	ameth_GostR3410_94 = NULL;
+	ameth_GostR3410_2001 = NULL;
+	ameth_Gost28147_MAC = NULL;
+
 	gost_param_free();
+	ERR_unload_GOST_strings();
 	return 1;
 	}
 
diff -ur ../openssl-1.0.0d/engines//ccgost/gost_pmeth.c ./engines//ccgost/gost_pmeth.c
--- ../openssl-1.0.0d/engines//ccgost/gost_pmeth.c	2009-06-16 20:39:20.000000000 +0400
+++ ./engines//ccgost/gost_pmeth.c	2011-09-11 16:12:12.000000000 +0400
@@ -568,6 +568,10 @@
 /* ----------------------------------------------------------------*/
 int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth,int flags)
 	{
+	if (*pmeth)
+	{
+		EVP_PKEY_meth_free(*pmeth);
+	}
 	*pmeth = EVP_PKEY_meth_new(id, flags);
 	if (!*pmeth) return 0;
 
