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