Correctly free selectop fields when select_resize fails in select_init

This commit is contained in:
Nick Mathewson 2011-01-12 20:28:47 -05:00
parent 83e805a415
commit 0c0ec0be2b

View File

@ -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);
}