SHA256
1
0
forked from pool/mailx
mailx/mailx-12.2-mime.dif
OBS User autobuild 1fc3a507c0 Accepting request 23998 from server:mail
Copy from server:mail/mailx based on submit request 23998 from user dirkmueller

OBS-URL: https://build.opensuse.org/request/show/23998
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/mailx?expand=0&rev=6
2009-11-10 09:16:13 +00:00

193 lines
6.2 KiB
Plaintext

Index: def.h
===================================================================
--- def.h.orig
+++ def.h
@@ -142,7 +142,8 @@ enum mimeclean {
MIME_LONGLINES = 002, /* has lines too long for RFC 2822 */
MIME_CTRLCHAR = 004, /* contains control characters */
MIME_HASNUL = 010, /* contains \0 characters */
- MIME_NOTERMNL = 020 /* lacks a terminating newline */
+ MIME_NOTERMNL = 020, /* lacks a terminating newline */
+ MIME_UTF8 = 040 /* UTF-8 high bit characters */
};
enum tdflags {
Index: mime.c
===================================================================
--- mime.c.orig
+++ mime.c
@@ -258,7 +258,10 @@ getcharset(int isclean)
if (isclean & (MIME_CTRLCHAR|MIME_HASNUL))
charset = NULL;
else if (isclean & MIME_HIGHBIT) {
- charset = wantcharset ? wantcharset : value("charset");
+ if (isclean & MIME_UTF8)
+ charset = defcharset;
+ if (charset == NULL)
+ charset = wantcharset ? wantcharset : value("charset");
if (charset == NULL) {
char *t = value("ttycharset");
if (t == NULL || (ascncasecmp("ANSI_X3.4", t, 9) == 0))
@@ -742,6 +745,7 @@ mime_isclean(FILE *f)
lastc = c;
c = getc(f);
curlen++;
+ check:
if (c == '\n' || c == EOF) {
/*
* RFC 821 imposes a maximum line length of 1000
@@ -754,10 +758,38 @@ mime_isclean(FILE *f)
curlen = 1;
} else if (c & 0200) {
isclean |= MIME_HIGHBIT;
+ if (c & 0100) {
+ int n, follow;
+
+ if ((c & 040) == 0) /* 110xxxxx */
+ follow = 1;
+ else if ((c & 020) == 0) /* 1110xxxx */
+ follow = 2;
+ else if ((c & 010) == 0) /* 11110xxx */
+ follow = 3;
+ else if ((c & 004) == 0) /* 111110xx */
+ follow = 4;
+ else if ((c & 002) == 0) /* 1111110x */
+ follow = 5;
+ else
+ continue;
+
+ for (n = 0; n < follow; n++) {
+ lastc = c;
+ c = getc(f);
+
+ if ((c & 0200) == 0 || (c & 0100) ||
+ (c == '\0') || (c == '\n') || (c == EOF)) {
+ curlen += n;
+ goto check;
+ }
+ }
+ isclean |= MIME_UTF8;
+ }
} else if (c == '\0') {
isclean |= MIME_HASNUL;
break;
- } else if ((c < 040 && (c != '\t' && c != '\f')) || c == 0177) {
+ } else if ((c < 040 && (c != '\t' && c != '\f' && c != '\b')) || c == 0177) {
isclean |= MIME_CTRLCHAR;
}
} while (c != EOF);
@@ -826,13 +858,16 @@ get_mime_convert(FILE *fp, char **conten
* ^I or ^L in text/plain bodies. However, some
* obscure character sets actually contain these
* characters, so the content type can be set.
+ * Beside ^I or ^L from RFC 2046 we accept also
+ * backspace ^H often used in enhanced text.
*/
if ((*contenttype = value("contenttype-cntrl")) == NULL)
*contenttype = "application/octet-stream";
} else
*contenttype = "text/plain";
*charset = getcharset(*isclean);
- }
+ } else if (ascncasecmp(*contenttype, "text/", 5) == 0)
+ *charset = getcharset(*isclean);
return convert;
}
Index: sendout.c
===================================================================
--- sendout.c.orig
+++ sendout.c
@@ -206,7 +206,7 @@ attach_file(struct attachment *ap, FILE
size_t bufsize, count;
int lastc = EOF;
#ifdef HAVE_ICONV
- char *tcs;
+ char *tcs = NULL;
#endif
if ((fi = Fopen(ap->a_name, "r")) == NULL) {
@@ -231,8 +231,16 @@ attach_file(struct attachment *ap, FILE
send_boundary, contenttype);
if (charset == NULL)
putc('\n', fo);
- else
- fprintf(fo, ";\n charset=%s\n", charset);
+ else {
+#ifdef HAVE_ICONV
+ if (wantcharset && ascncasecmp(wantcharset, "ANSI_X3.4", 9))
+ tcs = wantcharset;
+ if (tcs)
+ fprintf(fo, ";\n charset=%s\n", tcs);
+ else
+#endif
+ fprintf(fo, ";\n charset=%s\n", charset);
+ }
if (ap->a_content_disposition == NULL)
ap->a_content_disposition = "attachment";
fprintf(fo, "Content-Transfer-Encoding: %s\n"
@@ -254,16 +262,15 @@ attach_file(struct attachment *ap, FILE
iconv_close(iconvd);
iconvd = (iconv_t)-1;
}
- tcs = gettcharset();
if ((isclean & (MIME_HASNUL|MIME_CTRLCHAR)) == 0 &&
ascncasecmp(contenttype, "text/", 5) == 0 &&
isclean & MIME_HIGHBIT &&
- charset != NULL && asccasecmp(charset, tcs)) {
- if ((iconvd = iconv_open_ft(charset, tcs)) == (iconv_t)-1 &&
+ charset != NULL && tcs != NULL && asccasecmp(charset, tcs)) {
+ if ((iconvd = iconv_open_ft(tcs, charset)) == (iconv_t)-1 &&
errno != 0) {
if (errno == EINVAL)
fprintf(stderr, catgets(catd, CATSET, 179,
- "Cannot convert from %s to %s\n"), tcs, charset);
+ "Cannot convert from %s to %s\n"), charset, tcs);
else
perror("iconv_open");
Fclose(fi);
@@ -467,6 +474,7 @@ infix(struct header *hp, FILE *fi, int d
}
if ((isclean & (MIME_HASNUL|MIME_CTRLCHAR)) == 0 &&
ascncasecmp(contenttype, "text/", 5) == 0 &&
+ ascncasecmp(tcs, "ANSI_X3.4", 9) &&
isclean & MIME_HIGHBIT &&
charset != NULL && asccasecmp(charset, tcs)) {
if (iconvd != (iconv_t)-1)
@@ -1162,8 +1170,9 @@ puthead(struct header *hp, FILE *fo, enu
return 1;
if ((addr = hp->h_organization) != NULL ||
(addr = value("ORGANIZATION")) != NULL) {
+ size_t len = strlen(addr);
fwrite("Organization: ", sizeof (char), 14, fo);
- if (mime_write(addr, sizeof *addr, strlen(addr), fo,
+ if (len && mime_write(addr, sizeof *addr, len, fo,
action == SEND_TODISP ?
CONV_NONE:CONV_TOHDR,
action == SEND_TODISP ?
@@ -1208,9 +1217,10 @@ puthead(struct header *hp, FILE *fo, enu
if (hp->h_subject != NULL && w & GSUBJECT) {
fwrite("Subject: ", sizeof (char), 9, fo);
if (ascncasecmp(hp->h_subject, "re: ", 4) == 0) {
+ size_t len = strlen(hp->h_subject + 4);
fwrite("Re: ", sizeof (char), 4, fo);
- if (mime_write(hp->h_subject + 4, sizeof *hp->h_subject,
- strlen(hp->h_subject + 4),
+ if (len && mime_write(hp->h_subject + 4,
+ sizeof *hp->h_subject, len,
fo, action == SEND_TODISP ?
CONV_NONE:CONV_TOHDR,
action == SEND_TODISP ?
@@ -1218,8 +1228,9 @@ puthead(struct header *hp, FILE *fo, enu
NULL, (size_t)0) == 0)
return 1;
} else if (*hp->h_subject) {
- if (mime_write(hp->h_subject, sizeof *hp->h_subject,
- strlen(hp->h_subject),
+ size_t len = strlen(hp->h_subject);
+ if (len && mime_write(hp->h_subject,
+ sizeof *hp->h_subject, len,
fo, action == SEND_TODISP ?
CONV_NONE:CONV_TOHDR,
action == SEND_TODISP ?