annotate src/lib/str-sanitize.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21322
diff changeset
1 /* Copyright (c) 2004-2017 Dovecot authors, see the included COPYING file */
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
10212
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
4 #include "unichar.h"
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "str.h"
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "str-sanitize.h"
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
8 static size_t str_sanitize_skip_start(const char *src, size_t max_bytes)
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
9 {
10212
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
10 unichar_t chr;
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
11 size_t i;
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
12
18789
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
13 for (i = 0; i < max_bytes && src[i] != '\0'; ) {
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
14 int len = uni_utf8_get_char_n(src+i, max_bytes-i, &chr);
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
15 if (len <= 0)
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
16 break;
10212
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
17 if ((unsigned char)src[i] < 32)
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
18 break;
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
19 i += len;
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
20 }
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
21 i_assert(i <= max_bytes);
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
22 return i;
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
23 }
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
24
18206
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
25 static void str_sanitize_truncate_char(string_t *dest, unsigned int initial_pos)
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
26 {
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
27 const unsigned char *data = str_data(dest);
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
28 size_t len = str_len(dest);
18206
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
29
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
30 if (len == initial_pos)
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
31 return;
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
32 if ((data[len-1] & 0x80) == 0) {
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
33 str_truncate(dest, len-1);
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
34 return;
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
35 }
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
36 /* truncate UTF-8 sequence. */
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
37 while (len > 0 && (data[len-1] & 0xc0) == 0x80)
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
38 len--;
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
39 if (len > 0 && (data[len-1] & 0xc0) == 0xc0)
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
40 len--;
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
41 if (len >= initial_pos)
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
42 str_truncate(dest, len);
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
43 }
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
44
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
45 void str_sanitize_append(string_t *dest, const char *src, size_t max_bytes)
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 {
21322
5ab8dc1a4a6f global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
47 size_t initial_pos = str_len(dest);
10212
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
48 unichar_t chr;
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
49 size_t i;
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
50
18789
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
51 for (i = 0; i < max_bytes && src[i] != '\0'; ) {
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
52 int len = uni_utf8_get_char_n(src+i, max_bytes-i, &chr);
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
53 if (len == 0)
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
54 break; /* input ended too early */
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
55
778b57788590 various: use new uni_utf8_get_char*() interface
Phil Carmody <phil@dovecot.fi>
parents: 18207
diff changeset
56 if (len < 0) {
10212
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
57 /* invalid UTF-8 */
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
58 str_append_c(dest, '?');
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
59 i++;
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
60 continue;
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
61 }
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
62 if ((unsigned char)src[i] < 32)
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
63 str_append_c(dest, '?');
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
64 else
18206
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
65 str_append_n(dest, src+i, len);
10212
f68c2cc1b32b str_sanitize(): Don't break UTF-8 input.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
66 i += len;
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
69 if (src[i] != '\0') {
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
70 if (max_bytes < 3)
18206
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
71 str_truncate(dest, initial_pos);
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
72 else {
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
73 while (str_len(dest) - initial_pos > max_bytes-3)
18206
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
74 str_sanitize_truncate_char(dest, initial_pos);
ee12ce691bd3 lib: Various fixes to str_sanitize*()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
75 }
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 str_append(dest, "...");
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 }
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
80 const char *str_sanitize(const char *src, size_t max_bytes)
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 {
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 string_t *str;
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
83 size_t i;
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
84
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
85 if (src == NULL)
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
86 return NULL;
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
87
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
88 i = str_sanitize_skip_start(src, max_bytes);
7002
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
89 if (src[i] == '\0')
f359a0a9407f str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents: 6891
diff changeset
90 return src;
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91
18207
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
92 str = t_str_new(I_MIN(max_bytes, 256));
081c7da83d8f lib: str_sanitize*() max_len parameter renamed to max_bytes to describe it more accurately.
Timo Sirainen <tss@iki.fi>
parents: 18206
diff changeset
93 str_sanitize_append(str, src, max_bytes);
2689
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 return str_c(str);
631611c2d6e6 Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 }