|
|
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));
|