8e0c1c2
Index: milter-greylist-4.2.3/dkimcheck.c
8e0c1c2
===================================================================
8e0c1c2
--- milter-greylist-4.2.3.orig/dkimcheck.c
8e0c1c2
+++ milter-greylist-4.2.3/dkimcheck.c
8e0c1c2
@@ -63,6 +63,7 @@ __RCSID("$Id: dkimcheck.c,v 1.4 2008/10/
8e0c1c2
 #include "dkimcheck.h"
8e0c1c2
 
8e0c1c2
 static DKIM_LIB *dkim_ptr = NULL;
8e0c1c2
+static pthread_rwlock_t dkim_lock;
8e0c1c2
 static sfsistat dkimcheck_error(struct mlfi_priv *);
8e0c1c2
 
8e0c1c2
 static sfsistat
8e0c1c2
@@ -115,28 +116,36 @@ dkimcheck_error(priv)
8e0c1c2
 }
8e0c1c2
 
8e0c1c2
 void
8e0c1c2
-dkimcheck_init(void)
8e0c1c2
+dkimcheck_clear(void)
8e0c1c2
 {
8e0c1c2
+	/*
8e0c1c2
+	 * XXX This probably leaves stale handles for messages being processed
8e0c1c2
+	 */
8e0c1c2
+
8e0c1c2
+	WRLOCK(&dkim_lock);
8e0c1c2
+	if (dkim_ptr != NULL)
8e0c1c2
+		dkim_close(dkim_ptr);
8e0c1c2
+	dkim_ptr = NULL;
8e0c1c2
+
8e0c1c2
 	if ((dkim_ptr = dkim_init(NULL, NULL)) == NULL) {
8e0c1c2
 		mg_log(LOG_ERR, "dkim_init() failed");
8e0c1c2
 		exit(EX_OSERR);
8e0c1c2
 	}
8e0c1c2
-
8e0c1c2
-	return;
8e0c1c2
+	UNLOCK(&dkim_lock);
8e0c1c2
 }
8e0c1c2
 
8e0c1c2
 void
8e0c1c2
-dkimcheck_clear(void)
8e0c1c2
+dkimcheck_init(void)
8e0c1c2
 {
8e0c1c2
-	/*
8e0c1c2
-	 * XXX This probably leaves stale handles for messages being processed
8e0c1c2
-	 */
8e0c1c2
-	if (dkim_ptr != NULL)
8e0c1c2
-		dkim_close(dkim_ptr);
8e0c1c2
-	dkim_ptr = NULL;
8e0c1c2
+	int error;
8e0c1c2
 
8e0c1c2
-	dkimcheck_init();
8e0c1c2
-	return;
8e0c1c2
+	if ((error = pthread_rwlock_init(&dkim_lock, NULL)) != 0) {
8e0c1c2
+		mg_log(LOG_ERR, "pthread_rwlock_init failed: %s",
8e0c1c2
+		    strerror(error));
8e0c1c2
+		exit(EX_OSERR);
8e0c1c2
+	}
8e0c1c2
+
8e0c1c2
+	dkimcheck_clear();
8e0c1c2
 }
8e0c1c2
 
8e0c1c2
 sfsistat
8e0c1c2
@@ -159,8 +168,11 @@ dkimcheck_header(name, value, priv)
8e0c1c2
 		if (priv->priv_dkimstat != DKIM_STAT_OK)
8e0c1c2
 			return SMFIS_CONTINUE;
8e0c1c2
 
8e0c1c2
+		WRLOCK(&dkim_lock);
8e0c1c2
 		priv->priv_dkim = dkim_verify(dkim_ptr, priv->priv_queueid,
8e0c1c2
 					      NULL, &priv->priv_dkimstat);
8e0c1c2
+		UNLOCK(&dkim_lock);
8e0c1c2
+
8e0c1c2
 		if (priv->priv_dkim == NULL) {
8e0c1c2
 			mg_log(LOG_ERR, "dkim_verify() failed: %s",
8e0c1c2
 			       dkim_getresultstr(priv->priv_dkimstat));