Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib/str-sanitize.c @ 8590:b9faf4db2a9f HEAD
Updated copyright notices to include year 2009.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 06 Jan 2009 09:25:38 -0500 |
parents | 7ed926ed7aa4 |
children | 23abbf14279c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1 /* Copyright (c) 2004-2009 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" |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "str.h" |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str-sanitize.h" |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
7002
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
7 static size_t str_sanitize_skip_start(const char *src, size_t max_len) |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
8 { |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
9 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
|
10 |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
11 for (i = 0; i < max_len; i++) { |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
12 if (((unsigned char)src[i] & 0x7f) < 32) |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
13 break; |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
14 } |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
15 return i; |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
16 } |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
17 |
2689
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 void str_sanitize_append(string_t *dest, const char *src, size_t max_len) |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 { |
7002
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
20 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
|
21 |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
22 i = str_sanitize_skip_start(src, max_len); |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
23 str_append_n(dest, src, i); |
2689
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
7002
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
25 for (; i < max_len && src[i] != '\0'; i++) { |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
26 if (((unsigned char)src[i] & 0x7f) < 32) |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
27 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
|
28 else |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
29 str_append_c(dest, src[i]); |
2689
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 } |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
7002
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
32 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
|
33 str_truncate(dest, str_len(dest) <= 3 ? 0 : str_len(dest)-3); |
2689
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 str_append(dest, "..."); |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 } |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 const char *str_sanitize(const char *src, size_t max_len) |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 { |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 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
|
41 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
|
42 |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
43 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
|
44 return NULL; |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
45 |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
46 i = str_sanitize_skip_start(src, max_len); |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
47 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
|
48 return src; |
2689
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 str = t_str_new(I_MIN(max_len, 256)); |
7002
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
51 str_append_n(str, src, i); |
f359a0a9407f
str_sanitize*(): Don't crash if max_len is less than 3.
Timo Sirainen <tss@iki.fi>
parents:
6891
diff
changeset
|
52 str_sanitize_append(str, src + i, max_len - i); |
2689
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 return str_c(str); |
631611c2d6e6
Added string sanitization functions.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 } |