diff options
-rw-r--r-- | buffer_iocp.c | 2 | ||||
-rw-r--r-- | event.c | 10 | ||||
-rw-r--r-- | evmap.c | 9 |
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; @@ -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); @@ -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]); \ |