mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 04:50:37 -04:00
Set the special "not found" evbuffer_ptr consistantly.
The _internal.pos_in_chain field was uninitialized or set to different values in different places returning the special "not found" pointer. Signed-off-by: Nir Soffer <nirsof@gmail.com>
This commit is contained in:
parent
261ba63dba
commit
e3e97ae31b
22
buffer.c
22
buffer.c
@ -132,6 +132,13 @@
|
|||||||
#define CHAIN_PINNED(ch) (((ch)->flags & EVBUFFER_MEM_PINNED_ANY) != 0)
|
#define CHAIN_PINNED(ch) (((ch)->flags & EVBUFFER_MEM_PINNED_ANY) != 0)
|
||||||
#define CHAIN_PINNED_R(ch) (((ch)->flags & EVBUFFER_MEM_PINNED_R) != 0)
|
#define CHAIN_PINNED_R(ch) (((ch)->flags & EVBUFFER_MEM_PINNED_R) != 0)
|
||||||
|
|
||||||
|
/* evbuffer_ptr support */
|
||||||
|
#define PTR_NOT_FOUND(ptr) do { \
|
||||||
|
(ptr)->pos = -1; \
|
||||||
|
(ptr)->_internal.chain = NULL; \
|
||||||
|
(ptr)->_internal.pos_in_chain = 0; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static void evbuffer_chain_align(struct evbuffer_chain *chain);
|
static void evbuffer_chain_align(struct evbuffer_chain *chain);
|
||||||
static int evbuffer_chain_should_realign(struct evbuffer_chain *chain,
|
static int evbuffer_chain_should_realign(struct evbuffer_chain *chain,
|
||||||
size_t datalen);
|
size_t datalen);
|
||||||
@ -1351,9 +1358,7 @@ evbuffer_search_eol(struct evbuffer *buffer,
|
|||||||
|
|
||||||
/* Avoid locking in trivial edge cases */
|
/* Avoid locking in trivial edge cases */
|
||||||
if (start && start->_internal.chain == NULL) {
|
if (start && start->_internal.chain == NULL) {
|
||||||
it.pos = -1;
|
PTR_NOT_FOUND(&it);
|
||||||
it._internal.chain = NULL;
|
|
||||||
it._internal.pos_in_chain = 0;
|
|
||||||
if (eol_len_out)
|
if (eol_len_out)
|
||||||
*eol_len_out = extra_drain;
|
*eol_len_out = extra_drain;
|
||||||
return it;
|
return it;
|
||||||
@ -1419,9 +1424,8 @@ evbuffer_search_eol(struct evbuffer *buffer,
|
|||||||
done:
|
done:
|
||||||
EVBUFFER_UNLOCK(buffer);
|
EVBUFFER_UNLOCK(buffer);
|
||||||
|
|
||||||
if (!ok) {
|
if (!ok)
|
||||||
it.pos = -1;
|
PTR_NOT_FOUND(&it);
|
||||||
}
|
|
||||||
if (eol_len_out)
|
if (eol_len_out)
|
||||||
*eol_len_out = extra_drain;
|
*eol_len_out = extra_drain;
|
||||||
|
|
||||||
@ -2352,8 +2356,7 @@ evbuffer_ptr_set(struct evbuffer *buf, struct evbuffer_ptr *pos,
|
|||||||
pos->_internal.chain = NULL;
|
pos->_internal.chain = NULL;
|
||||||
pos->_internal.pos_in_chain = 0;
|
pos->_internal.pos_in_chain = 0;
|
||||||
} else {
|
} else {
|
||||||
pos->_internal.chain = NULL;
|
PTR_NOT_FOUND(pos);
|
||||||
pos->pos = -1;
|
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2464,8 +2467,7 @@ evbuffer_search_range(struct evbuffer *buffer, const char *what, size_t len, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
not_found:
|
not_found:
|
||||||
pos.pos = -1;
|
PTR_NOT_FOUND(&pos);
|
||||||
pos._internal.chain = NULL;
|
|
||||||
done:
|
done:
|
||||||
EVBUFFER_UNLOCK(buffer);
|
EVBUFFER_UNLOCK(buffer);
|
||||||
return pos;
|
return pos;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user