There is a deadlock situation when ud-mailgate gets a mail claiming to be from userdir-ldap-0.3.56
authorPeter Palfrader <peter@palfrader.org>
Wed, 17 Dec 2008 11:58:32 +0000 (12:58 +0100)
committerPeter Palfrader <peter@palfrader.org>
Wed, 17 Dec 2008 11:58:32 +0000 (12:58 +0100)
itself:
 - ud-mailgate opens and locks the replay cache
 - verification of the mail fails for whatever reason
 - a reply is sent (to itself)
 - exim tries to deliver the mail by directly calling ud-mailgate
 - ud-mailgate tries to acquire the lock -> deadlock
Fix this by changing when we open the replay cache, and unlock it as soon as we
are done.

debian/changelog
ud-mailgate

index d444941..5430cfc 100644 (file)
@@ -1,3 +1,17 @@
+userdir-ldap (0.3.56) unstable; urgency=low
+
+  * There is a deadlock situation when ud-mailgate gets a mail claiming
+    to be from itself:
+    - ud-mailgate opens and locks the replay cache
+    - verification of the mail fails for whatever reason
+    - a reply is sent (to itself)
+    - exim tries to deliver the mail by directly calling ud-mailgate
+    - ud-mailgate tries to acquire the lock -> deadlock
+    Fix this by changing when we open the replay cache, and unlock it
+    as soon as we are done.
+
+ -- Peter Palfrader <weasel@debian.org>  Wed, 17 Dec 2008 12:54:10 +0100
+
 userdir-ldap (0.3.55) unstable; urgency=low
 
   [ Joey Schulze ]
index 1c9f998..a3a21a8 100755 (executable)
@@ -668,8 +668,6 @@ try:
    # Startup the replay cache
    ErrType = EX_TEMPFAIL;
    ErrMsg = "Failed to initialize the replay cache:";
-   RC = ReplayCache(ReplayCacheFile);
-   RC.Clean();
 
    # Get the email 
    ErrType = EX_PERMFAIL;
@@ -704,12 +702,6 @@ try:
    else:
       PlainText = Res[3];   
 
-   # Check the signature against the replay cache
-   ErrMsg = "The replay cache rejected your message. Check your clock!";
-   Rply = RC.Check(Res[1]);
-   if Rply != None:
-      raise Error, Rply;
-
    # Connect to the ldap server
    ErrType = EX_TEMPFAIL;
    ErrMsg = "An error occured while performing the LDAP lookup";
@@ -726,7 +718,17 @@ try:
    if len(Attrs) != 1:
       raise Error, "Oddly your key fingerprint is assigned to more than one account.."
 
+
+   # Check the signature against the replay cache
+   RC = ReplayCache(ReplayCacheFile);
+   RC.Clean();
+   ErrMsg = "The replay cache rejected your message. Check your clock!";
+   Rply = RC.Check(Res[1]);
+   if Rply != None:
+      RC.close()
+      raise Error, Rply;
    RC.Add(Res[1]);
+   RC.close()
 
    # Determine the sender address
    ErrMsg = "A problem occured while trying to formulate the reply";