diff --git a/crypto/err/err.c b/crypto/err/err.c
index 69713a6..4f7048f 100644
--- a/crypto/err/err.c
+++ b/crypto/err/err.c
@@ -1041,6 +1041,28 @@ ERR_STATE *ERR_get_state(void)
 	return ret;
 	}
 
+static void thread_free_doall(ERR_STATE *es)
+	{
+	if (es == NULL)
+		return;
+
+	ERR_STATE_free(es);
+	}
+
+static IMPLEMENT_LHASH_DOALL_FN(thread_free,ERR_STATE);
+
+void ERR_free_state_table(void)
+	{
+	CRYPTO_w_lock(CRYPTO_LOCK_ERR);
+	if (int_thread_hash != NULL)
+		{
+		lh_ERR_STATE_doall(int_thread_hash, LHASH_DOALL_FN(thread_free));
+		lh_ERR_STATE_free(int_thread_hash);
+		int_thread_hash = NULL;
+		}
+	CRYPTO_w_unlock(CRYPTO_LOCK_ERR);
+	}
+
 int ERR_get_next_error_library(void)
 	{
 	err_fns_check();
diff --git a/crypto/err/err.h b/crypto/err/err.h
index b9f8c16..628aa9a 100644
--- a/crypto/err/err.h
+++ b/crypto/err/err.h
@@ -357,6 +357,7 @@ void ERR_remove_thread_state(const CRYPTO_THREADID *tid);
 void ERR_remove_state(unsigned long pid); /* if zero we look it up */
 #endif
 ERR_STATE *ERR_get_state(void);
+void ERR_free_state_table(void);
 
 #ifndef OPENSSL_NO_LHASH
 LHASH_OF(ERR_STRING_DATA) *ERR_get_string_table(void);
diff --git a/util/libeay.num b/util/libeay.num
index c4cfffa..4434c3e 100755
--- a/util/libeay.num
+++ b/util/libeay.num
@@ -4161,3 +4161,4 @@ X509_NAME_hash_old                      4535	EXIST::FUNCTION:
 ASN1_TIME_set_string                    4536	EXIST::FUNCTION:
 EVP_MD_flags                            4537	EXIST::FUNCTION:
 TS_RESP_CTX_free                        4538	EXIST::FUNCTION:
+ERR_free_state_table                    4539	EXIST::FUNCTION:
