summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--buffer_iocp.c2
-rw-r--r--event.c10
-rw-r--r--evmap.c9
3 files changed, 16 insertions, 5 deletions
diff --git a/buffer_iocp.c b/buffer_iocp.c
index 54289879..f59b42a3 100644
--- a/buffer_iocp.c
+++ b/buffer_iocp.c
@@ -151,6 +151,8 @@ evbuffer_overlapped_new(evutil_socket_t fd)
struct evbuffer_overlapped *evo;
evo = mm_calloc(1, sizeof(struct evbuffer_overlapped));
+ if (!evo)
+ return NULL;
TAILQ_INIT(&evo->buffer.callbacks);
evo->buffer.refcnt = 1;
diff --git a/event.c b/event.c
index 62ec7f54..18de9137 100644
--- a/event.c
+++ b/event.c
@@ -682,13 +682,19 @@ event_base_free(struct event_base *base)
/* XXXX grab the lock? If there is contention when one thread frees
* the base, then the contending thread will be very sad soon. */
+ /* event_base_free(NULL) is how to free the current_base if we
+ * made it with event_init and forgot to hold a reference to it. */
if (base == NULL && current_base)
base = current_base;
+ /* If we're freeing current_base, there won't be a current_base. */
if (base == current_base)
current_base = NULL;
-
+ /* Don't actually free NULL. */
+ if (base == NULL) {
+ event_warnx("%s: no base to free", __func__);
+ return;
+ }
/* XXX(niels) - check for internal events first */
- EVUTIL_ASSERT(base);
#ifdef _WIN32
event_base_stop_iocp(base);
diff --git a/evmap.c b/evmap.c
index 8af448ea..626bfb7d 100644
--- a/evmap.c
+++ b/evmap.c
@@ -128,7 +128,8 @@ HT_GENERATE(event_io_map, event_map_entry, map_node, hashsocket, eqsocket,
}, \
{ \
_ent = mm_calloc(1,sizeof(struct event_map_entry)+fdinfo_len); \
- EVUTIL_ASSERT(_ent); \
+ if (EVUTIL_UNLIKELY(_ent == NULL)) \
+ return (-1); \
_ent->fd = slot; \
(ctor)(&_ent->ent.type); \
_HT_FOI_INSERT(map_node, map, &_key, _ent, ptr) \
@@ -160,14 +161,16 @@ void evmap_io_clear(struct event_io_map *ctx)
(x) = (struct type *)((map)->entries[slot])
/* As GET_SLOT, but construct the entry for 'slot' if it is not present,
by allocating enough memory for a 'struct type', and initializing the new
- value by calling the function 'ctor' on it.
+ value by calling the function 'ctor' on it. Makes the function
+ return -1 on allocation failure.
*/
#define GET_SIGNAL_SLOT_AND_CTOR(x, map, slot, type, ctor, fdinfo_len) \
do { \
if ((map)->entries[slot] == NULL) { \
(map)->entries[slot] = \
mm_calloc(1,sizeof(struct type)+fdinfo_len); \
- EVUTIL_ASSERT((map)->entries[slot] != NULL); \
+ if (EVUTIL_UNLIKELY((map)->entries[slot] == NULL)) \
+ return (-1); \
(ctor)((struct type *)(map)->entries[slot]); \
} \
(x) = (struct type *)((map)->entries[slot]); \