mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 04:50:37 -04:00
fail without leaking memory when poll set extension fails
svn:r249
This commit is contained in:
parent
d698965928
commit
025b009bb6
48
poll.c
48
poll.c
@ -234,29 +234,48 @@ poll_add(void *arg, struct event *ev)
|
|||||||
|
|
||||||
poll_check_ok(pop);
|
poll_check_ok(pop);
|
||||||
if (pop->nfds + 1 >= pop->event_count) {
|
if (pop->nfds + 1 >= pop->event_count) {
|
||||||
|
struct pollfd *tmp_event_set;
|
||||||
|
struct event **tmp_event_r_back;
|
||||||
|
struct event **tmp_event_w_back;
|
||||||
|
int tmp_event_count;
|
||||||
|
|
||||||
if (pop->event_count < 32)
|
if (pop->event_count < 32)
|
||||||
pop->event_count = 32;
|
tmp_event_count = 32;
|
||||||
else
|
else
|
||||||
pop->event_count *= 2;
|
tmp_event_count = pop->event_count * 2;
|
||||||
|
|
||||||
/* We need more file descriptors */
|
/* We need more file descriptors */
|
||||||
pop->event_set = realloc(pop->event_set,
|
tmp_event_set = realloc(pop->event_set,
|
||||||
pop->event_count * sizeof(struct pollfd));
|
tmp_event_count * sizeof(struct pollfd));
|
||||||
if (pop->event_set == NULL) {
|
if (tmp_event_set == NULL) {
|
||||||
event_warn("realloc");
|
event_warn("realloc");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
pop->event_r_back = realloc(pop->event_r_back,
|
pop->event_set = tmp_event_set;
|
||||||
pop->event_count * sizeof(struct event *));
|
|
||||||
pop->event_w_back = realloc(pop->event_w_back,
|
tmp_event_r_back = realloc(pop->event_r_back,
|
||||||
pop->event_count * sizeof(struct event *));
|
tmp_event_count * sizeof(struct event *));
|
||||||
if (pop->event_r_back == NULL ||
|
if (tmp_event_r_back == NULL) {
|
||||||
pop->event_w_back == NULL) {
|
/* event_set overallocated; that's okay. */
|
||||||
event_warn("realloc");
|
event_warn("realloc");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
pop->event_r_back = tmp_event_r_back;
|
||||||
|
|
||||||
|
tmp_event_w_back = realloc(pop->event_w_back,
|
||||||
|
tmp_event_count * sizeof(struct event *));
|
||||||
|
if (tmp_event_w_back == NULL) {
|
||||||
|
/* event_set and event_r_back overallocated; that's
|
||||||
|
* okay. */
|
||||||
|
event_warn("realloc");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
pop->event_w_back = tmp_event_w_back;
|
||||||
|
|
||||||
|
pop->event_count = tmp_event_count;
|
||||||
}
|
}
|
||||||
if (ev->ev_fd >= pop->fd_count) {
|
if (ev->ev_fd >= pop->fd_count) {
|
||||||
|
int *tmp_idxplus1_by_fd;
|
||||||
int new_count;
|
int new_count;
|
||||||
if (pop->fd_count < 32)
|
if (pop->fd_count < 32)
|
||||||
new_count = 32;
|
new_count = 32;
|
||||||
@ -264,12 +283,13 @@ poll_add(void *arg, struct event *ev)
|
|||||||
new_count = pop->fd_count * 2;
|
new_count = pop->fd_count * 2;
|
||||||
while (new_count <= ev->ev_fd)
|
while (new_count <= ev->ev_fd)
|
||||||
new_count *= 2;
|
new_count *= 2;
|
||||||
pop->idxplus1_by_fd =
|
tmp_idxplus1_by_fd =
|
||||||
realloc(pop->idxplus1_by_fd, new_count*sizeof(int));
|
realloc(pop->idxplus1_by_fd, new_count * sizeof(int));
|
||||||
if (pop->idxplus1_by_fd == NULL) {
|
if (tmp_idxplus1_by_fd == NULL) {
|
||||||
event_warn("realloc");
|
event_warn("realloc");
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
pop->idxplus1_by_fd = tmp_idxplus1_by_fd;
|
||||||
memset(pop->idxplus1_by_fd + pop->fd_count,
|
memset(pop->idxplus1_by_fd + pop->fd_count,
|
||||||
0, sizeof(int)*(new_count - pop->fd_count));
|
0, sizeof(int)*(new_count - pop->fd_count));
|
||||||
pop->fd_count = new_count;
|
pop->fd_count = new_count;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user