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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
0ae9b03a0f05 Last update broke used size.
Timo Sirainen <tss@iki.fi>
parents: 830
diff changeset
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
1f4216e1d060 cleanup
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
72 pool_get_name(buf->pool));
1757
ebc6c417e6bc minor optimizations
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
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
ea833e894759 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
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
7577fb89916a Added buffer_get_pool()
Timo Sirainen <tss@iki.fi>
parents: 5025
diff changeset
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
7577fb89916a Added buffer_get_pool()
Timo Sirainen <tss@iki.fi>
parents: 5025
diff changeset
173
7577fb89916a Added buffer_get_pool()
Timo Sirainen <tss@iki.fi>
parents: 5025
diff changeset
174 return buf->pool;
7577fb89916a Added buffer_get_pool()
Timo Sirainen <tss@iki.fi>
parents: 5025
diff changeset
175 }
7577fb89916a Added buffer_get_pool()
Timo Sirainen <tss@iki.fi>
parents: 5025
diff changeset
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
875e7a46a2db Added buffer_reset()
Timo Sirainen <tss@iki.fi>
parents: 2413
diff changeset
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
875e7a46a2db Added buffer_reset()
Timo Sirainen <tss@iki.fi>
parents: 2413
diff changeset
180 }
875e7a46a2db Added buffer_reset()
Timo Sirainen <tss@iki.fi>
parents: 2413
diff changeset
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
ebc6c417e6bc minor optimizations
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
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
ebc6c417e6bc minor optimizations
Timo Sirainen <tss@iki.fi>
parents: 1741
diff changeset
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
f25f48725d95 Added buffer_insert_zero()
Timo Sirainen <tss@iki.fi>
parents: 2617
diff changeset
285 {
f25f48725d95 Added buffer_insert_zero()
Timo Sirainen <tss@iki.fi>
parents: 2617
diff changeset
286 struct real_buffer *buf = (struct real_buffer *)_buf;
f25f48725d95 Added buffer_insert_zero()
Timo Sirainen <tss@iki.fi>
parents: 2617
diff changeset
287
f25f48725d95 Added buffer_insert_zero()
Timo Sirainen <tss@iki.fi>
parents: 2617
diff changeset
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
f25f48725d95 Added buffer_insert_zero()
Timo Sirainen <tss@iki.fi>
parents: 2617
diff changeset
294 }
f25f48725d95 Added buffer_insert_zero()
Timo Sirainen <tss@iki.fi>
parents: 2617
diff changeset
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
875e7a46a2db Added buffer_reset()
Timo Sirainen <tss@iki.fi>
parents: 2413
diff changeset
354 buf->dirty = buf->used;
875e7a46a2db Added buffer_reset()
Timo Sirainen <tss@iki.fi>
parents: 2413
diff changeset
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
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
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
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
381 {
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
382 if (buf1->used != buf2->used)
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
383 return FALSE;
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
384
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
385 return memcmp(buf1->data, buf2->data, buf1->used) == 0;
fb9eee567307 Added buffer_cmp().
Timo Sirainen <tss@iki.fi>
parents: 3234
diff changeset
386 }
15571
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
387
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
388 void buffer_verify_pool(buffer_t *_buf)
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
389 {
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
390 const struct real_buffer *buf = (const struct real_buffer *)_buf;
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
391 void *ret;
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
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
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
394 /* this doesn't really do anything except verify the
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
395 stack frame */
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
396 ret = p_realloc(buf->pool, buf->w_buffer,
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
397 buf->alloc, buf->alloc);
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
398 i_assert(ret == buf->w_buffer);
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
399 }
9fda4feb6e2d Added buffer_verify_pool()
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
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