Mercurial > dovecot > core-2.2
annotate src/lib/buffer.c @ 23017:c1d36f2575c7 default tip
lib-imap: Fix "Don't accept strings with NULs" cherry-pick
author | Timo Sirainen <timo.sirainen@open-xchange.com> |
---|---|
date | Thu, 29 Aug 2019 09:55:25 +0300 |
parents | d7ad84cec527 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2002-2018 Dovecot authors, see the included COPYING file */ |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
3 /* @UNSAFE: whole file */ |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
4 |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "lib.h" |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "buffer.h" |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
8 struct real_buffer { |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
9 /* public: */ |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
10 const unsigned char *r_buffer; |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
11 size_t used; |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
12 |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
13 /* private: */ |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
14 unsigned char *w_buffer; |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
15 size_t dirty, alloc; |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
16 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
851
diff
changeset
|
17 pool_t pool; |
831 | 18 |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 unsigned int alloced:1; |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
20 unsigned int dynamic:1; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
18368
3ed51d56e2a3
lib: buffer - paranoid compile-time check for struct sizes
Phil Carmody <phil@dovecot.fi>
parents:
18137
diff
changeset
|
22 typedef int buffer_check_sizes[COMPILE_ERROR_IF_TRUE(sizeof(struct real_buffer) > sizeof(buffer_t)) ?1:1]; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
24 static void buffer_alloc(struct real_buffer *buf, size_t size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 { |
851
e73389a2324a
Several fixes. I think it's beginning to look safe.
Timo Sirainen <tss@iki.fi>
parents:
832
diff
changeset
|
26 i_assert(buf->w_buffer == NULL || buf->alloced); |
e73389a2324a
Several fixes. I think it's beginning to look safe.
Timo Sirainen <tss@iki.fi>
parents:
832
diff
changeset
|
27 |
e73389a2324a
Several fixes. I think it's beginning to look safe.
Timo Sirainen <tss@iki.fi>
parents:
832
diff
changeset
|
28 if (size == buf->alloc) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 return; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
851
e73389a2324a
Several fixes. I think it's beginning to look safe.
Timo Sirainen <tss@iki.fi>
parents:
832
diff
changeset
|
31 i_assert(size > buf->alloc); |
830
27774d0493dd
Fixed several bugs, added a small testsuite. Still requires careful auditing.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
32 |
20098
d30ebb5a7e3a
lib: Use p_malloc() explicitly in first buffer_alloc()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
33 if (buf->w_buffer == NULL) |
d30ebb5a7e3a
lib: Use p_malloc() explicitly in first buffer_alloc()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
34 buf->w_buffer = p_malloc(buf->pool, size); |
d30ebb5a7e3a
lib: Use p_malloc() explicitly in first buffer_alloc()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
35 else |
d30ebb5a7e3a
lib: Use p_malloc() explicitly in first buffer_alloc()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
36 buf->w_buffer = p_realloc(buf->pool, buf->w_buffer, buf->alloc, size); |
851
e73389a2324a
Several fixes. I think it's beginning to look safe.
Timo Sirainen <tss@iki.fi>
parents:
832
diff
changeset
|
37 buf->alloc = size; |
941
4d6b69558add
Added old_size parameter to p_realloc() - we rarely need it and this way
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
38 |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 buf->r_buffer = buf->w_buffer; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 buf->alloced = TRUE; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
43 static inline void |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
44 buffer_check_limits(struct real_buffer *buf, size_t pos, size_t data_size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 { |
15790
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
46 unsigned int extra; |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
47 size_t new_size; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
49 if (unlikely((size_t)-1 - pos < data_size)) { |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
50 i_panic("Buffer write out of range (%"PRIuSIZE_T |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
51 " + %"PRIuSIZE_T")", pos, data_size); |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
52 } |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
53 new_size = pos + data_size; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
7303
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
55 if (new_size > buf->used && buf->used < buf->dirty) { |
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
56 /* clear used..dirty area */ |
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
57 size_t max = I_MIN(I_MIN(buf->alloc, buf->dirty), new_size); |
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
58 |
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
59 memset(buf->w_buffer + buf->used, 0, max - buf->used); |
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
60 } |
15790
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
61 |
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
62 /* always keep +1 byte allocated available in case str_c() is called |
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
63 for this buffer. this is mainly for cases where the buffer is |
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
64 allocated from data stack, and str_c() is called in a separate stack |
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
65 frame. */ |
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
66 extra = buf->dynamic ? 1 : 0; |
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
67 if (new_size + extra > buf->alloc) { |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
68 if (unlikely(!buf->dynamic)) { |
2858
3ecf8b2dfab0
Print pool name for "buffer full" errors.
Timo Sirainen <tss@iki.fi>
parents:
2814
diff
changeset
|
69 i_panic("Buffer full (%"PRIuSIZE_T" > %"PRIuSIZE_T", " |
3ecf8b2dfab0
Print pool name for "buffer full" errors.
Timo Sirainen <tss@iki.fi>
parents:
2814
diff
changeset
|
70 "pool %s)", pos + data_size, buf->alloc, |
12037
edb490f2ad6a
liblib: Don't segfault if write is attempted beyond non-dynamic buffer's bounds.
Timo Sirainen <tss@iki.fi>
parents:
11578
diff
changeset
|
71 buf->pool == NULL ? "<none>" : |
5025 | 72 pool_get_name(buf->pool)); |
1757 | 73 } |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
3234
06f9da4ff7a5
Added pool_get_exp_grown_size(). Use it for buffers, istreams and ostreams
Timo Sirainen <tss@iki.fi>
parents:
3189
diff
changeset
|
75 buffer_alloc(buf, pool_get_exp_grown_size(buf->pool, buf->alloc, |
15790
c762a9af72c1
buffer: Always keep +1 byte available for str_c()'s NUL.
Timo Sirainen <tss@iki.fi>
parents:
15604
diff
changeset
|
76 new_size + extra)); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 } |
11578
2e686a6403e3
DEBUG: Removed buffer's tests against overflows. It slows down too much.
Timo Sirainen <tss@iki.fi>
parents:
11223
diff
changeset
|
78 #if 0 |
11223
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
79 else if (new_size > buf->used && buf->alloced && |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
80 !buf->pool->alloconly_pool && !buf->pool->datastack_pool) { |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
81 void *new_buf; |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
82 |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
83 /* buffer's size increased: move the buffer's memory elsewhere. |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
84 this should help catch bugs where old pointers are tried to |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
85 be used to access the buffer's memory */ |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
86 new_buf = p_malloc(buf->pool, buf->alloc); |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
87 memcpy(new_buf, buf->w_buffer, buf->alloc); |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
88 p_free(buf->pool, buf->w_buffer); |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
89 |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
90 buf->w_buffer = new_buf; |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
91 buf->r_buffer = new_buf; |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
92 } |
7037222941dc
DEBUG: Try to catch stale pointer dereferences to buffers after they've grown.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
93 #endif |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (new_size > buf->used) |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 buf->used = new_size; |
8841 | 97 i_assert(buf->used <= buf->alloc); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
17654
5601d3e9d2a3
lib: compile time checks for buffer creation
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
100 #undef buffer_create_from_data |
15034
7efef678bca8
Renamed buffer_create_*data() to buffer_create_from_*data() for consistency.
Timo Sirainen <tss@iki.fi>
parents:
15033
diff
changeset
|
101 void buffer_create_from_data(buffer_t *buffer, void *data, size_t size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
103 struct real_buffer *buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 |
9623
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
105 i_assert(sizeof(*buffer) >= sizeof(struct real_buffer)); |
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
106 |
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
107 buf = (struct real_buffer *)buffer; |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21213
diff
changeset
|
108 i_zero(buf); |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
109 buf->alloc = size; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 buf->r_buffer = buf->w_buffer = data; |
15033
34076ab28d28
buffer_create_data(): Clear the memory area immediately.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
111 /* clear the whole memory area. unnecessary usually, but if the |
34076ab28d28
buffer_create_data(): Clear the memory area immediately.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
112 buffer is used by e.g. str_c() it tries to access uninitialized |
34076ab28d28
buffer_create_data(): Clear the memory area immediately.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
113 memory */ |
34076ab28d28
buffer_create_data(): Clear the memory area immediately.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
114 memset(data, 0, size); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
17654
5601d3e9d2a3
lib: compile time checks for buffer creation
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
117 #undef buffer_create_from_const_data |
15034
7efef678bca8
Renamed buffer_create_*data() to buffer_create_from_*data() for consistency.
Timo Sirainen <tss@iki.fi>
parents:
15033
diff
changeset
|
118 void buffer_create_from_const_data(buffer_t *buffer, |
7efef678bca8
Renamed buffer_create_*data() to buffer_create_from_*data() for consistency.
Timo Sirainen <tss@iki.fi>
parents:
15033
diff
changeset
|
119 const void *data, size_t size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
121 struct real_buffer *buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
9623
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
123 i_assert(sizeof(*buffer) >= sizeof(struct real_buffer)); |
3449
5f83939aab50
Added buffer_update_const_data().
Timo Sirainen <tss@iki.fi>
parents:
3252
diff
changeset
|
124 |
9623
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
125 buf = (struct real_buffer *)buffer; |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21213
diff
changeset
|
126 i_zero(buf); |
3449
5f83939aab50
Added buffer_update_const_data().
Timo Sirainen <tss@iki.fi>
parents:
3252
diff
changeset
|
127 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
128 buf->used = buf->alloc = size; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 buf->r_buffer = data; |
3449
5f83939aab50
Added buffer_update_const_data().
Timo Sirainen <tss@iki.fi>
parents:
3252
diff
changeset
|
130 i_assert(buf->w_buffer == NULL); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
133 buffer_t *buffer_create_dynamic(pool_t pool, size_t init_size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
135 struct real_buffer *buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
137 buf = p_new(pool, struct real_buffer, 1); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 buf->pool = pool; |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
139 buf->dynamic = TRUE; |
20099
c89167e445fd
lib: buffer_create_dynamic() now adds +1 to init_size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20098
diff
changeset
|
140 /* buffer_alloc() reserves +1 for str_c() NIL, so add +1 here to |
c89167e445fd
lib: buffer_create_dynamic() now adds +1 to init_size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20098
diff
changeset
|
141 init_size so we can actually write that much to the buffer without |
c89167e445fd
lib: buffer_create_dynamic() now adds +1 to init_size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20098
diff
changeset
|
142 realloc */ |
c89167e445fd
lib: buffer_create_dynamic() now adds +1 to init_size
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20098
diff
changeset
|
143 buffer_alloc(buf, init_size+1); |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
144 return (buffer_t *)buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
5680
diff
changeset
|
147 void buffer_free(buffer_t **_buf) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
149 struct real_buffer *buf = (struct real_buffer *)*_buf; |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
150 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
151 *_buf = NULL; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 if (buf->alloced) |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 p_free(buf->pool, buf->w_buffer); |
9623
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
154 if (buf->pool != NULL) |
3da42dafa798
buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents:
8841
diff
changeset
|
155 p_free(buf->pool, buf); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 |
6414
a6a49d5efc59
Changed buffer_free() and buffer_free_without_data() APIs to take ** pointer
Timo Sirainen <tss@iki.fi>
parents:
5680
diff
changeset
|
158 void *buffer_free_without_data(buffer_t **_buf) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 { |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
160 struct real_buffer *buf = (struct real_buffer *)*_buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 void *data; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
163 *_buf = NULL; |
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
164 |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 data = buf->w_buffer; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 p_free(buf->pool, buf); |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 return data; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7303
diff
changeset
|
170 pool_t buffer_get_pool(const buffer_t *_buf) |
5680 | 171 { |
7912
81806d402514
Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents:
7303
diff
changeset
|
172 const struct real_buffer *buf = (const struct real_buffer *)_buf; |
5680 | 173 |
174 return buf->pool; | |
175 } | |
176 | |
7303
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
177 void buffer_reset(buffer_t *buf) |
2423 | 178 { |
7303
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
179 buffer_set_used_size(buf, 0); |
2423 | 180 } |
181 | |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
182 void buffer_write(buffer_t *_buf, size_t pos, |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
183 const void *data, size_t data_size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
185 struct real_buffer *buf = (struct real_buffer *)_buf; |
1757 | 186 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
187 buffer_check_limits(buf, pos, data_size); |
21213
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21057
diff
changeset
|
188 if (data_size > 0) |
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21057
diff
changeset
|
189 memcpy(buf->w_buffer + pos, data, data_size); |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
190 } |
1757 | 191 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
192 void buffer_append(buffer_t *buf, const void *data, size_t data_size) |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
193 { |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
194 buffer_write(buf, buf->used, data, data_size); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
197 void buffer_append_c(buffer_t *buf, unsigned char chr) |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
198 { |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
199 buffer_append(buf, &chr, 1); |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
200 } |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
201 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
202 void buffer_insert(buffer_t *_buf, size_t pos, |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
203 const void *data, size_t data_size) |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
204 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
205 struct real_buffer *buf = (struct real_buffer *)_buf; |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
206 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
207 if (pos >= buf->used) |
2801
7cf652f2a33a
Don't return values from void functions.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
208 buffer_write(_buf, pos, data, data_size); |
2814
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
209 else { |
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
210 buffer_copy(_buf, pos + data_size, _buf, pos, (size_t)-1); |
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
211 memcpy(buf->w_buffer + pos, data, data_size); |
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
212 } |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
213 } |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
214 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
215 void buffer_delete(buffer_t *_buf, size_t pos, size_t size) |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
216 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
217 struct real_buffer *buf = (struct real_buffer *)_buf; |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
218 size_t end_size; |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
219 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
220 if (pos >= buf->used) |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
221 return; |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
222 end_size = buf->used - pos; |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
223 |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
224 if (size < end_size) { |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
225 /* delete from between */ |
830
27774d0493dd
Fixed several bugs, added a small testsuite. Still requires careful auditing.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
226 end_size -= size; |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
227 memmove(buf->w_buffer + pos, |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
228 buf->w_buffer + pos + size, end_size); |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
229 } else { |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
230 /* delete the rest of the buffer */ |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
231 end_size = 0; |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
232 } |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
233 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
234 buffer_set_used_size(_buf, pos + end_size); |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
235 } |
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
236 |
23008
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
237 void buffer_replace(buffer_t *_buf, size_t pos, size_t size, |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
238 const void *data, size_t data_size) |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
239 { |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
240 struct real_buffer *buf = (struct real_buffer *)_buf; |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
241 size_t end_size; |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
242 |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
243 if (pos >= buf->used) { |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
244 buffer_write(_buf, pos, data, data_size); |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
245 return; |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
246 } |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
247 end_size = buf->used - pos; |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
248 |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
249 if (size < end_size) { |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
250 end_size -= size; |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
251 if (data_size == 0) { |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
252 /* delete from between */ |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
253 memmove(buf->w_buffer + pos, |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
254 buf->w_buffer + pos + size, end_size); |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
255 } else { |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
256 /* insert */ |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
257 buffer_copy(_buf, pos + data_size, _buf, pos + size, |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
258 (size_t)-1); |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
259 memcpy(buf->w_buffer + pos, data, data_size); |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
260 } |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
261 } else { |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
262 /* overwrite the end */ |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
263 end_size = 0; |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
264 buffer_write(_buf, pos, data, data_size); |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
265 } |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
266 |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
267 buffer_set_used_size(_buf, pos + data_size + end_size); |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
268 } |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
269 |
d7ad84cec527
lib: buffer - Add buffer_replace().
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22713
diff
changeset
|
270 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
271 void buffer_write_zero(buffer_t *_buf, size_t pos, size_t data_size) |
2617
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
272 { |
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
273 struct real_buffer *buf = (struct real_buffer *)_buf; |
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
274 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
275 buffer_check_limits(buf, pos, data_size); |
2617
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
276 memset(buf->w_buffer + pos, 0, data_size); |
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
277 } |
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
278 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
279 void buffer_append_zero(buffer_t *buf, size_t data_size) |
2617
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
280 { |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
281 buffer_write_zero(buf, buf->used, data_size); |
2617
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
282 } |
b14bbcf002d9
Added buffer_write_zero and buffer_append_zero.
Timo Sirainen <tss@iki.fi>
parents:
2562
diff
changeset
|
283 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
284 void buffer_insert_zero(buffer_t *_buf, size_t pos, size_t data_size) |
2682 | 285 { |
286 struct real_buffer *buf = (struct real_buffer *)_buf; | |
287 | |
288 if (pos >= buf->used) | |
2801
7cf652f2a33a
Don't return values from void functions.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
289 buffer_write_zero(_buf, pos, data_size); |
2814
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
290 else { |
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
291 buffer_copy(_buf, pos + data_size, _buf, pos, (size_t)-1); |
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
292 memset(buf->w_buffer + pos, 0, data_size); |
b85473a4df1b
buffer_insert() and buffer_insert_zero() didn't work correctly when it used
Timo Sirainen <tss@iki.fi>
parents:
2801
diff
changeset
|
293 } |
2682 | 294 } |
295 | |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
296 void buffer_copy(buffer_t *_dest, size_t dest_pos, |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
297 const buffer_t *_src, size_t src_pos, size_t copy_size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
299 struct real_buffer *dest = (struct real_buffer *)_dest; |
4020
fcfd44f56b04
While casting const pointers to something else, the const was often
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
300 const struct real_buffer *src = (const struct real_buffer *)_src; |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
301 size_t max_size; |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
302 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
303 i_assert(src_pos <= src->used); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
305 max_size = src->used - src_pos; |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
306 if (copy_size > max_size) |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
307 copy_size = max_size; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
309 buffer_check_limits(dest, dest_pos, copy_size); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 if (src == dest) { |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 memmove(dest->w_buffer + dest_pos, |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 src->r_buffer + src_pos, copy_size); |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 } else { |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 memcpy(dest->w_buffer + dest_pos, |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 src->r_buffer + src_pos, copy_size); |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
319 void buffer_append_buf(buffer_t *dest, const buffer_t *src, |
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
320 size_t src_pos, size_t copy_size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 { |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
322 buffer_copy(dest, dest->used, src, src_pos, copy_size); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
325 void *buffer_get_space_unsafe(buffer_t *_buf, size_t pos, size_t size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
327 struct real_buffer *buf = (struct real_buffer *)_buf; |
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
328 |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2706
diff
changeset
|
329 buffer_check_limits(buf, pos, size); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 return buf->w_buffer + pos; |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
1471
8f56379c3917
Renamed buffer_*_space() to buffer_*_space_unsafe() and added several
Timo Sirainen <tss@iki.fi>
parents:
941
diff
changeset
|
333 void *buffer_append_space_unsafe(buffer_t *buf, size_t size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
335 return buffer_get_space_unsafe(buf, buf->used, size); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4020
diff
changeset
|
338 void *buffer_get_modifiable_data(const buffer_t *_buf, size_t *used_size_r) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 { |
4020
fcfd44f56b04
While casting const pointers to something else, the const was often
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
340 const struct real_buffer *buf = (const struct real_buffer *)_buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 |
3189
f80be7e73f71
Minor cleanup: added _r suffix to used_size pointer parameters.
Timo Sirainen <tss@iki.fi>
parents:
2858
diff
changeset
|
342 if (used_size_r != NULL) |
f80be7e73f71
Minor cleanup: added _r suffix to used_size pointer parameters.
Timo Sirainen <tss@iki.fi>
parents:
2858
diff
changeset
|
343 *used_size_r = buf->used; |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
344 return buf->w_buffer; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
347 void buffer_set_used_size(buffer_t *_buf, size_t used_size) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 { |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
349 struct real_buffer *buf = (struct real_buffer *)_buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
351 i_assert(used_size <= buf->alloc); |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 |
7303
db4a29902723
buffer_reset(buf) and buffer_set_used_size(buf, 0) now do the same thing.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
353 if (buf->used > buf->dirty) |
2423 | 354 buf->dirty = buf->used; |
355 | |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
356 buf->used = used_size; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 } |
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
359 size_t buffer_get_size(const buffer_t *_buf) |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 { |
4020
fcfd44f56b04
While casting const pointers to something else, the const was often
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
361 const struct real_buffer *buf = (const struct real_buffer *)_buf; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 |
2412
daf5ea7556bc
Removed start_pos and limit handling, they weren't used much and were only
Timo Sirainen <tss@iki.fi>
parents:
1839
diff
changeset
|
363 return buf->alloc; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 } |
3252 | 365 |
18719
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
366 size_t buffer_get_writable_size(const buffer_t *_buf) |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
367 { |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
368 const struct real_buffer *buf = (const struct real_buffer *)_buf; |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
369 |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
370 if (!buf->dynamic || buf->alloc == 0) |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
371 return buf->alloc; |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
372 |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
373 /* we reserve +1 for str_c() NUL in buffer_check_limits(), so don't |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
374 include that in our return value. otherwise the caller might |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
375 increase the buffer's alloc size unnecessarily when it just wants |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
376 to access the entire buffer. */ |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
377 return buf->alloc-1; |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
378 } |
3deb3fd654c6
lib: Added buffer_get_writable_size()
Timo Sirainen <tss@iki.fi>
parents:
18368
diff
changeset
|
379 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3449
diff
changeset
|
380 bool buffer_cmp(const buffer_t *buf1, const buffer_t *buf2) |
3252 | 381 { |
382 if (buf1->used != buf2->used) | |
383 return FALSE; | |
384 | |
385 return memcmp(buf1->data, buf2->data, buf1->used) == 0; | |
386 } | |
15571 | 387 |
388 void buffer_verify_pool(buffer_t *_buf) | |
389 { | |
390 const struct real_buffer *buf = (const struct real_buffer *)_buf; | |
391 void *ret; | |
392 | |
15604
e098f2f90fb2
DEBUG: buffer_verify_pool() crashed with empty buffer.
Timo Sirainen <tss@iki.fi>
parents:
15603
diff
changeset
|
393 if (buf->pool != NULL && buf->pool->datastack_pool && buf->alloc > 0) { |
15571 | 394 /* this doesn't really do anything except verify the |
395 stack frame */ | |
396 ret = p_realloc(buf->pool, buf->w_buffer, | |
397 buf->alloc, buf->alloc); | |
398 i_assert(ret == buf->w_buffer); | |
399 } | |
400 } | |
21057
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
401 |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
402 void buffer_truncate_rshift_bits(buffer_t *buf, size_t bits) |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
403 { |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
404 /* no-op if it's shorten than bits in any case.. */ |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
405 if (buf->used * 8 < bits) return; |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
406 |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
407 if (bits > 0) { |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
408 /* truncate it to closest byte boundary */ |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
409 size_t bytes = ((bits + 7) & -8U)/8; |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
410 /* remainding bits */ |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
411 bits = bits % 8; |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
412 buffer_set_used_size(buf, I_MIN(bytes, buf->used)); |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
413 unsigned char *ptr = buffer_get_modifiable_data(buf, &bytes); |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
414 /* right shift over byte array */ |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
415 if (bits > 0) { |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
416 for(size_t i=bytes-1;i>0;i--) |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
417 ptr[i] = (ptr[i]>>(8-bits)) + |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
418 ((ptr[i-1]&(0xff>>(bits)))<<bits); |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
419 ptr[0] = ptr[0]>>(8-bits); |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
420 } |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
421 } else { |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
422 buffer_set_used_size(buf, 0); |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
423 } |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
424 } |
d373fde16da7
lib: Add buffer truncate
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
20099
diff
changeset
|
425 |