mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-17 00:07:04 -04:00
Correctly free selectop fields when select_resize fails in select_init
This commit is contained in:
parent
83e805a415
commit
0c0ec0be2b
18
select.c
18
select.c
@ -90,6 +90,7 @@ const struct eventop selectops = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int select_resize(struct selectop *sop, int fdsz);
|
static int select_resize(struct selectop *sop, int fdsz);
|
||||||
|
static void select_free_selectop(struct selectop *sop);
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
select_init(struct event_base *base)
|
select_init(struct event_base *base)
|
||||||
@ -100,9 +101,7 @@ select_init(struct event_base *base)
|
|||||||
return (NULL);
|
return (NULL);
|
||||||
|
|
||||||
if (select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask))) {
|
if (select_resize(sop, howmany(32 + 1, NFDBITS)*sizeof(fd_mask))) {
|
||||||
/* select_resize might have left this around. */
|
select_free_selectop(sop);
|
||||||
if (sop->event_readset_in)
|
|
||||||
mm_free(sop->event_readset_in);
|
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,11 +305,8 @@ select_del(struct event_base *base, int fd, short old, short events, void *p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
select_dealloc(struct event_base *base)
|
select_free_selectop(struct selectop *sop)
|
||||||
{
|
{
|
||||||
struct selectop *sop = base->evbase;
|
|
||||||
|
|
||||||
evsig_dealloc(base);
|
|
||||||
if (sop->event_readset_in)
|
if (sop->event_readset_in)
|
||||||
mm_free(sop->event_readset_in);
|
mm_free(sop->event_readset_in);
|
||||||
if (sop->event_writeset_in)
|
if (sop->event_writeset_in)
|
||||||
@ -323,3 +319,11 @@ select_dealloc(struct event_base *base)
|
|||||||
memset(sop, 0, sizeof(struct selectop));
|
memset(sop, 0, sizeof(struct selectop));
|
||||||
mm_free(sop);
|
mm_free(sop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
select_dealloc(struct event_base *base)
|
||||||
|
{
|
||||||
|
evsig_dealloc(base);
|
||||||
|
|
||||||
|
select_free_selectop(base->evbase);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user