openbsd-ports/mail/claws-mail/patches/patch-src_procmime_c
landry d011b2b6e0 Update to claws-mail 3.8.1 and plugins :
- attremover 1.0.14
- htmlviewer 0.32
- notification 0.30
- rssyl 0.33
- vcalendar 2.0.13

While here add patches for upstream bugs #2840, #2841 and #2842. Add
links to corresponding patches for tracking purposes.

All from Christopher Zimmermann, thanks!
2012-06-29 14:02:54 +00:00

167 lines
4.3 KiB
Plaintext

$OpenBSD: patch-src_procmime_c,v 1.7 2012/06/29 14:02:54 landry Exp $
http://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id=2640
http://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id=2641
http://www.thewildbeast.co.uk/claws-mail/bugzilla/show_bug.cgi?id=2642
--- src/procmime.c.orig Fri Dec 16 09:09:32 2011
+++ src/procmime.c Tue Apr 3 14:59:40 2012
@@ -562,16 +562,29 @@ gboolean procmime_encode_content(MimeInfo *mimeinfo, E
g_free(tmp_file);
}
} else if (encoding == ENC_QUOTED_PRINTABLE) {
- gchar inbuf[BUFFSIZE], outbuf[BUFFSIZE * 4];
+ gchar inbuf[79], outbuf[77];
+ gint n, len = 0;
+ gboolean firstrun = TRUE;
- while (fgets(inbuf, sizeof(inbuf), infp) != NULL) {
- qp_encode_line(outbuf, inbuf);
+ while ((len += fread(inbuf + len, 1,
+ sizeof(inbuf) - len - 1,
+ infp)) > 0)
+ {
+ if (firstrun == FALSE)
+ if (fputs("\r\n", outfp) == EOF)
+ err = TRUE;
+ inbuf[len] = '\0';
+ n = qp_encode(mimeinfo->type == MIMETYPE_TEXT,
+ outbuf, inbuf, len);
+ len -= n;
+ memmove(inbuf, inbuf + n, len);
+
if (!strncmp("From ", outbuf, sizeof("From ")-1)) {
gchar *tmpbuf = outbuf;
-
+
tmpbuf += sizeof("From ")-1;
-
+
if (fputs("=46rom ", outfp) == EOF)
err = TRUE;
if (fputs(tmpbuf, outfp) == EOF)
@@ -580,14 +593,40 @@ gboolean procmime_encode_content(MimeInfo *mimeinfo, E
if (fputs(outbuf, outfp) == EOF)
err = TRUE;
}
+ firstrun = FALSE;
}
} else {
- gchar buf[BUFFSIZE];
+ gchar buf[MAXSMTPTEXTLEN+1];
+ gint leftover = 0;
- while (fgets(buf, sizeof(buf), infp) != NULL) {
- strcrchomp(buf);
- if (fputs(buf, outfp) == EOF)
+ while (fgets(buf + leftover,
+ sizeof(buf) - leftover,
+ infp) != NULL)
+ {
+ gchar *l, *c = buf;
+ leftover = 0;
+
+ while (*c != '\0') {
+ if (
+ *c == '\n'
+ || (*c == '\r' && *(c+1) == '\n'))
+ {
+ *c = '\0';
+ break;
+ }
+ c++;
+ }
+ while (c - buf > MAXSMTPTEXTLEN - 2) {
+ *c = *(c-1);
+ *--c = '\0';
+ leftover++;
+ }
+
+ if (fputs(buf, outfp) == EOF || putc('\n', outfp) == EOF)
err = TRUE;
+
+ for (l = buf; l-buf < leftover; l++)
+ *l = *++c;
}
}
@@ -1094,7 +1133,7 @@ GList *procmime_get_mime_type_list(void)
#endif
{
fp_is_glob_file = FALSE;
- if ((fp = g_fopen("/etc/mime.types", "rb")) == NULL) {
+ if ((fp = g_fopen("/var/www/conf/mime.types", "rb")) == NULL) {
if ((fp = g_fopen(SYSCONFDIR "/mime.types", "rb"))
== NULL) {
FILE_OP_ERROR(SYSCONFDIR "/mime.types",
@@ -1174,11 +1213,12 @@ EncodingType procmime_get_encoding_for_text_file(const
{
FILE *fp;
guchar buf[BUFFSIZE];
+ gboolean cr = FALSE;
size_t len;
+ gint linelen = 0, maxlinelen = 0;
size_t octet_chars = 0;
size_t total_len = 0;
gfloat octet_percentage;
- gboolean force_b64 = FALSE;
if ((fp = g_fopen(file, "rb")) == NULL) {
FILE_OP_ERROR(file, "fopen");
@@ -1190,11 +1230,27 @@ EncodingType procmime_get_encoding_for_text_file(const
gint i;
for (p = buf, i = 0; i < len; ++p, ++i) {
- if (*p & 0x80)
- ++octet_chars;
- if (*p == '\0') {
- force_b64 = TRUE;
+ switch (*p) {
+ case '\n':
+ if (cr) linelen--;
+ maxlinelen = MAX(linelen, maxlinelen);
+ linelen = 0;
+ cr = FALSE;
+ break;
+ case '\r':
+ cr = TRUE;
+ linelen++;
+ break;
+ case '\0':
*has_binary = TRUE;
+ maxlinelen = G_MAXINT;
+ cr = FALSE;
+ break;
+ default:
+ if (*p & 0x80)
+ octet_chars++;
+ linelen++;
+ cr = FALSE;
}
}
total_len += len;
@@ -1208,15 +1264,20 @@ EncodingType procmime_get_encoding_for_text_file(const
octet_percentage = 0.0;
debug_print("procmime_get_encoding_for_text_file(): "
- "8bit chars: %zd / %zd (%f%%)\n", octet_chars, total_len,
- 100.0 * octet_percentage);
+ "8bit chars: %zd / %zd (%f%%). "
+ "maximum line length: %d chars\n",
+ octet_chars, total_len, 100.0 * octet_percentage,
+ maxlinelen);
- if (octet_percentage > 0.20 || force_b64) {
+ if (octet_percentage > 0.20) {
debug_print("using BASE64\n");
return ENC_BASE64;
- } else if (octet_chars > 0) {
+ } else if (maxlinelen > MAXSMTPTEXTLEN-2) {
debug_print("using quoted-printable\n");
return ENC_QUOTED_PRINTABLE;
+ } else if (octet_chars > 0) {
+ debug_print("using 8bit\n");
+ return ENC_8BIT;
} else {
debug_print("using 7bit\n");
return ENC_7BIT;