diff --git a/lib/modules/Tools.pmod/PEM.pmod b/lib/modules/Tools.pmod/PEM.pmod
index 0f56a5db086c9433b122c53885ee00c53b618910..35b5383c3116cfaa1056d7486009eb2c04fa594a 100644
--- a/lib/modules/Tools.pmod/PEM.pmod
+++ b/lib/modules/Tools.pmod/PEM.pmod
@@ -98,6 +98,9 @@ class rfc934 {
 
     for(; i < sizeof(parts); i++)
       {
+#ifdef PEM_DEBUG
+	werror(sprintf("parts[%d] = '%s'\n", i, parts[i]));
+#endif
 	if (sizeof(parts[i]) && (parts[i][0] == ' '))
 	  {
 	    /* Escape, just remove the "- " prefix */
@@ -123,10 +126,20 @@ class rfc934 {
 
 	int end = search(parts[i], "\n");
 	if (end >= 0)
-	  {
-	    boundary = "-" + parts[i][..end-1];
-	    current = parts[i][end..];
-	  }
+	{
+	  boundary = "-" + parts[i][..end-1];
+	  current = parts[i][end..];
+	} else {
+	  /* This is a special case that happens if the input data had
+	   * no terminating newline after the final boundary. */
+#ifdef PEM_DEBUG
+	  werror(sprintf("Final boundary, with no terminating newline.\n"
+			 "  boundary='%s'\n", boundary));
+#endif
+
+	  boundary = "-" + parts[i];
+	  break;
+	}
       }
     final_text = current;
     final_boundary = boundary;
diff --git a/lib/modules/Tools.pmod/_PEM.pmod b/lib/modules/Tools.pmod/_PEM.pmod
index 96adbf9387e398996798bacfc71d2df316d9f5ce..b17c979677b9131ed447a6d55f724c42fc273e66 100644
--- a/lib/modules/Tools.pmod/_PEM.pmod
+++ b/lib/modules/Tools.pmod/_PEM.pmod
@@ -10,9 +10,13 @@ object rfc822_start_re = Regexp("^([-a-zA-Z][a-zA-Z0-9]*[ \t]*:|[ \t]*\n\n)");
 
 /* Regexp used to extract the interesting part of an encapsulation
  * boundary. Also strips spaces, and requires that the string in the
- * middle between ---foo  --- is at least two characters long. */
+ * middle between ---foo  --- is at least two characters long. Also
+ * allow a trailing \r or other white space characters. */
 
-object rfc934_eb_re = Regexp("^-*[ \t]*([^- \t].*[^- \t])[ \t]*-*$");
+object rfc934_eb_re = Regexp(
+  "^-*[ \r\t]*([^- \r\t]"	/* First non dash-or-space character */
+  ".*[^- \r\t])"		/* Last non dash-or-space character */
+  "[ \r\t]*-*[ \r\t]*$");	/* Trailing space, dashes and space */
 
 /* Start and end markers for PEM */
 
@@ -44,6 +48,15 @@ string dash_stuff(string msg)
   return parts * "- -";
 }
 
+#if 0
+string chop_cr(string s)
+{
+  return (strlen(s) && (s[-1] == '\r'))
+    ? s[..strlen(s) - 2]
+    : s;
+}
+#endif
+
 /* Strip dashes */
 string extract_boundary(string s)
 {