Mercurial > dovecot > core-2.2
annotate src/lib-mail/message-header-decode.c @ 6954:aee731c09668 HEAD
If we encounter an unknown charset, get the ASCII (or UTF-8 actually)
characters instead of ignoring it completely.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 08 Dec 2007 15:59:48 +0200 |
parents | 63e225ab7361 |
children | 7ed926ed7aa4 |
rev | line source |
---|---|
6429
65c69a53a7be
Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents:
6133
diff
changeset
|
1 /* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */ |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "base64.h" |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "buffer.h" |
6131
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6123
diff
changeset
|
6 #include "unichar.h" |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
7 #include "charset-utf8.h" |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "quoted-printable.h" |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "message-header-decode.h" |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
5517 | 11 static size_t |
12 message_header_decode_encoded(const unsigned char *data, size_t size, | |
13 buffer_t *decodebuf, unsigned int *charsetlen_r) | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 { |
5517 | 15 #define QCOUNT 3 |
16 unsigned int num = 0; | |
17 size_t i, start_pos[QCOUNT]; | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
5517 | 19 /* data should contain "charset?encoding?text?=" */ |
20 for (i = 0; i < size; i++) { | |
21 if (data[i] == '?') { | |
22 start_pos[num++] = i; | |
23 if (num == QCOUNT) | |
24 break; | |
25 } | |
26 } | |
27 if (i == size || data[i+1] != '=') { | |
28 /* invalid block */ | |
29 return 0; | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 } |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
5517 | 32 buffer_append(decodebuf, data, start_pos[0]); |
33 buffer_append_c(decodebuf, '\0'); | |
34 *charsetlen_r = decodebuf->used; | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
5517 | 36 switch (data[start_pos[0]+1]) { |
37 case 'q': | |
38 case 'Q': | |
39 quoted_printable_decode(data + start_pos[1] + 1, | |
40 start_pos[2] - start_pos[1] - 1, | |
41 NULL, decodebuf); | |
42 break; | |
43 case 'b': | |
44 case 'B': | |
45 if (base64_decode(data + start_pos[1] + 1, | |
46 start_pos[2] - start_pos[1] - 1, | |
47 NULL, decodebuf) < 0) { | |
48 /* contains invalid data. show what we got so far. */ | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } |
5517 | 50 break; |
51 default: | |
52 /* unknown encoding */ | |
53 return 0; | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 } |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
5517 | 56 return start_pos[2] + 2; |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 } |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 void message_header_decode(const unsigned char *data, size_t size, |
1038
60646878858e
Function typedefs now define them as functions, not function pointers.
Timo Sirainen <tss@iki.fi>
parents:
953
diff
changeset
|
60 message_header_decode_callback_t *callback, |
953
411006be3c66
Naming change for function typedefs.
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
61 void *context) |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 { |
5517 | 63 buffer_t *decodebuf = NULL; |
64 unsigned int charsetlen = 0; | |
6950
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
65 size_t pos, start_pos, ret; |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
5517 | 67 /* =?charset?Q|B?text?= */ |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 start_pos = pos = 0; |
5517 | 69 for (pos = 0; pos + 1 < size; ) { |
70 if (data[pos] != '=' || data[pos+1] != '?') { | |
71 pos++; | |
72 continue; | |
73 } | |
74 | |
75 /* encoded string beginning */ | |
76 if (pos != start_pos) { | |
77 /* send the unencoded data so far */ | |
78 if (!callback(data + start_pos, pos - start_pos, | |
79 NULL, context)) { | |
80 start_pos = size; | |
81 break; | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 } |
5517 | 83 } |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
5517 | 85 if (decodebuf == NULL) { |
6537
58d9f94b9919
message_header_decode(): Don't use t_push/t_pop. The callback may want to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
86 decodebuf = buffer_create_dynamic(default_pool, |
58d9f94b9919
message_header_decode(): Don't use t_push/t_pop. The callback may want to
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
87 size - pos); |
5517 | 88 } else { |
89 buffer_set_used_size(decodebuf, 0); | |
90 } | |
91 | |
92 pos += 2; | |
6950
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
93 ret = message_header_decode_encoded(data + pos, size - pos, |
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
94 decodebuf, &charsetlen); |
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
95 if (ret == 0) { |
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
96 start_pos = pos-2; |
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
97 continue; |
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
98 } |
63e225ab7361
If header contains invalid MIME input, preserve the =? in output.
Timo Sirainen <tss@iki.fi>
parents:
6910
diff
changeset
|
99 pos += ret; |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 |
5517 | 101 if (decodebuf->used > charsetlen) { |
102 /* decodebuf contains <charset> NUL <text> */ | |
103 if (!callback(CONST_PTR_OFFSET(decodebuf->data, | |
104 charsetlen), | |
105 decodebuf->used - charsetlen, | |
106 decodebuf->data, context)) { | |
107 start_pos = size; | |
108 break; | |
109 } | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 } |
5517 | 111 |
112 start_pos = pos; | |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 } |
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
5517 | 115 if (size != start_pos) { |
5503 | 116 (void)callback(data + start_pos, size - start_pos, |
117 NULL, context); | |
118 } | |
6538
1b7d91f7b151
Fix for last change: don't crash if temp buffer wasn't created..
Timo Sirainen <tss@iki.fi>
parents:
6537
diff
changeset
|
119 if (decodebuf != NULL) |
1b7d91f7b151
Fix for last change: don't crash if temp buffer wasn't created..
Timo Sirainen <tss@iki.fi>
parents:
6537
diff
changeset
|
120 buffer_free(&decodebuf); |
783
d826ab8c8d62
Quoted-Printable decoding was buggy. Extracted RFC2047 header decoding into
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 } |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
122 |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
123 struct decode_utf8_context { |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
124 buffer_t *dest; |
6121
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
125 unsigned int changed:1; |
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
126 unsigned int called:1; |
6133
fd9f6b4d846e
Renamed ucase parameters to dtcase which is more correct.
Timo Sirainen <tss@iki.fi>
parents:
6132
diff
changeset
|
127 unsigned int dtcase:1; |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
128 }; |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
129 |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
130 static bool |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
131 decode_utf8_callback(const unsigned char *data, size_t size, |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
132 const char *charset, void *context) |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
133 { |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
134 struct decode_utf8_context *ctx = context; |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
135 struct charset_translation *t; |
6910
c68564884bae
charset_to_utf8_begin() was called with bad flags parameter (although it
Timo Sirainen <tss@iki.fi>
parents:
6538
diff
changeset
|
136 enum charset_flags flags; |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
137 |
6121
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
138 /* one call with charset=NULL means nothing changed */ |
6123
d3299ed1332a
Fixed message_header_decode_utf8() to return FALSE also for single
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
139 if (!ctx->called && charset == NULL) |
6121
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
140 ctx->called = TRUE; |
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
141 else |
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
142 ctx->changed = TRUE; |
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
143 |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
144 if (charset == NULL || charset_is_utf8(charset)) { |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
145 /* ASCII / UTF-8 */ |
6133
fd9f6b4d846e
Renamed ucase parameters to dtcase which is more correct.
Timo Sirainen <tss@iki.fi>
parents:
6132
diff
changeset
|
146 if (ctx->dtcase) { |
6131
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6123
diff
changeset
|
147 (void)uni_utf8_to_decomposed_titlecase(data, size, |
5f56b2eb32b3
Use uni_utf8_to_decomposed_titlecase() to have proper case-insensitive UTF-8
Timo Sirainen <tss@iki.fi>
parents:
6123
diff
changeset
|
148 ctx->dest); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
149 } else { |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
150 buffer_append(ctx->dest, data, size); |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
151 } |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
152 return TRUE; |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
153 } |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
154 |
6910
c68564884bae
charset_to_utf8_begin() was called with bad flags parameter (although it
Timo Sirainen <tss@iki.fi>
parents:
6538
diff
changeset
|
155 flags = ctx->dtcase ? CHARSET_FLAG_DECOMP_TITLECASE : 0; |
c68564884bae
charset_to_utf8_begin() was called with bad flags parameter (although it
Timo Sirainen <tss@iki.fi>
parents:
6538
diff
changeset
|
156 if (charset_to_utf8_begin(charset, flags, &t) < 0) { |
6954
aee731c09668
If we encounter an unknown charset, get the ASCII (or UTF-8 actually)
Timo Sirainen <tss@iki.fi>
parents:
6950
diff
changeset
|
157 /* data probably still contains some valid ASCII characters. |
aee731c09668
If we encounter an unknown charset, get the ASCII (or UTF-8 actually)
Timo Sirainen <tss@iki.fi>
parents:
6950
diff
changeset
|
158 append them. */ |
aee731c09668
If we encounter an unknown charset, get the ASCII (or UTF-8 actually)
Timo Sirainen <tss@iki.fi>
parents:
6950
diff
changeset
|
159 if (uni_utf8_get_valid_data(data, size, ctx->dest)) |
aee731c09668
If we encounter an unknown charset, get the ASCII (or UTF-8 actually)
Timo Sirainen <tss@iki.fi>
parents:
6950
diff
changeset
|
160 buffer_append(ctx->dest, data, size); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
161 return TRUE; |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
162 } |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
163 |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
164 /* ignore any errors */ |
6122
d86581f4a0c6
charset_to_utf8() isn't used anymore, so renamed charset_to_utf8_full() to it.
Timo Sirainen <tss@iki.fi>
parents:
6121
diff
changeset
|
165 (void)charset_to_utf8(t, data, &size, ctx->dest); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
166 charset_to_utf8_end(&t); |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
167 return TRUE; |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
168 } |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
169 |
6121
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
170 bool message_header_decode_utf8(const unsigned char *data, size_t size, |
6133
fd9f6b4d846e
Renamed ucase parameters to dtcase which is more correct.
Timo Sirainen <tss@iki.fi>
parents:
6132
diff
changeset
|
171 buffer_t *dest, bool dtcase) |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
172 { |
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
173 struct decode_utf8_context ctx; |
6123
d3299ed1332a
Fixed message_header_decode_utf8() to return FALSE also for single
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
174 size_t used = dest->used; |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
175 |
6121
157e31742eeb
message_header_decode_utf8() returns not TRUE if it actually changed
Timo Sirainen <tss@iki.fi>
parents:
6118
diff
changeset
|
176 memset(&ctx, 0, sizeof(ctx)); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
177 ctx.dest = dest; |
6133
fd9f6b4d846e
Renamed ucase parameters to dtcase which is more correct.
Timo Sirainen <tss@iki.fi>
parents:
6132
diff
changeset
|
178 ctx.dtcase = dtcase; |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
179 message_header_decode(data, size, decode_utf8_callback, &ctx); |
6123
d3299ed1332a
Fixed message_header_decode_utf8() to return FALSE also for single
Timo Sirainen <tss@iki.fi>
parents:
6122
diff
changeset
|
180 return ctx.changed || (dest->used - used != size); |
6118
841b052e269e
Added message_header_decode_utf8(). Use it in message decoder instead of
Timo Sirainen <tss@iki.fi>
parents:
5517
diff
changeset
|
181 } |