Dennis Preiser
2011-01-18 17:23:09 UTC
Headers in news_headers_to_display are not properly unfolded. Beside
headers like Subject:, which are displayed 'as is', some headers are
altered. For example, the following From:-header:
From: Dennis Preiser
<***@example.org>
is displayed as:
From: Dennis Preiser? <***@example.org>
'\n' is replaced by '?'. The same happens with Reply-To:.
Attached patch adds unfold_header_to_display() to cook.c which does the
unfolding for news_headers_to_display. At this point we cannot use
rfc2046.c:unfold_header() because the leading '\t' of subsequent folded
lines is not replaced with ' ' there.
With this patch all headers in news_headers_to_display gets unfolded. I'm
not shure whether this is necessary or not.
Dennis
--- tin-1.9.6_r3/src/cook.c 2011-01-17 21:28:56.000000000 +0100
+++ tin-1.9.6_r4/src/cook.c 2011-01-18 17:43:08.000000000 +0100
@@ -60,6 +60,7 @@ static t_bool header_wanted(const char *
static t_part *new_uue(t_part **part, char *name);
static void process_text_body_part(t_bool wrap_lines, FILE *in, t_part *part, int hide_uue);
static void put_cooked(size_t buf_len, t_bool wrap_lines, int flags, const char *fmt, ...);
+static void unfold_header_to_display(char *line);
#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
static t_bool wexpand_ctrl_chars(wchar_t **wline, size_t *length, size_t lcook_width);
#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
@@ -778,6 +779,26 @@ charset_unsupported(
}
+static void
+unfold_header_to_display(
+ char *line)
+{
+ char *src = line, *dst = line;
+
+ while (*src) {
+ if (*src == '\n' && *(src + 1) && *(src + 1) == '\t') {
+ *dst++ = ' ';
+ src += 2;
+ } else if (*src == '\n') {
+ ++src;
+ } else {
+ *dst++ = *src++;
+ }
+ }
+ *dst = '\0';
+}
+
+
/*
* 'cooks' an article, ie, prepare what will actually appear on the screen
* It is not easy to do this in the same pass as the initial read since
@@ -850,7 +871,7 @@ cook_article(
size_t i = LEN;
t_bool found = FALSE;
+ unfold_header_to_display(line);
/* structured headers */
do {
if (!strncasecmp(line, *strptr, strlen(*strptr))) {
headers like Subject:, which are displayed 'as is', some headers are
altered. For example, the following From:-header:
From: Dennis Preiser
<***@example.org>
is displayed as:
From: Dennis Preiser? <***@example.org>
'\n' is replaced by '?'. The same happens with Reply-To:.
Attached patch adds unfold_header_to_display() to cook.c which does the
unfolding for news_headers_to_display. At this point we cannot use
rfc2046.c:unfold_header() because the leading '\t' of subsequent folded
lines is not replaced with ' ' there.
With this patch all headers in news_headers_to_display gets unfolded. I'm
not shure whether this is necessary or not.
Dennis
--- tin-1.9.6_r3/src/cook.c 2011-01-17 21:28:56.000000000 +0100
+++ tin-1.9.6_r4/src/cook.c 2011-01-18 17:43:08.000000000 +0100
@@ -60,6 +60,7 @@ static t_bool header_wanted(const char *
static t_part *new_uue(t_part **part, char *name);
static void process_text_body_part(t_bool wrap_lines, FILE *in, t_part *part, int hide_uue);
static void put_cooked(size_t buf_len, t_bool wrap_lines, int flags, const char *fmt, ...);
+static void unfold_header_to_display(char *line);
#if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
static t_bool wexpand_ctrl_chars(wchar_t **wline, size_t *length, size_t lcook_width);
#endif /* MULTIBYTE_ABLE && !NO_LOCALE */
@@ -778,6 +779,26 @@ charset_unsupported(
}
+static void
+unfold_header_to_display(
+ char *line)
+{
+ char *src = line, *dst = line;
+
+ while (*src) {
+ if (*src == '\n' && *(src + 1) && *(src + 1) == '\t') {
+ *dst++ = ' ';
+ src += 2;
+ } else if (*src == '\n') {
+ ++src;
+ } else {
+ *dst++ = *src++;
+ }
+ }
+ *dst = '\0';
+}
+
+
/*
* 'cooks' an article, ie, prepare what will actually appear on the screen
* It is not easy to do this in the same pass as the initial read since
@@ -850,7 +871,7 @@ cook_article(
size_t i = LEN;
t_bool found = FALSE;
+ unfold_header_to_display(line);
/* structured headers */
do {
if (!strncasecmp(line, *strptr, strlen(*strptr))) {