Mercurial > dovecot > core-2.2
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 |
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 } |