mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
- For #376: Fix that comm point event is not double removed or double
added to event map.
This commit is contained in:
parent
08968baec1
commit
4d51c6b86e
3 changed files with 34 additions and 6 deletions
|
|
@ -1,3 +1,7 @@
|
||||||
|
4 January 2021: Wouter
|
||||||
|
- For #376: Fix that comm point event is not double removed or double
|
||||||
|
added to event map.
|
||||||
|
|
||||||
16 December 2020: George
|
16 December 2020: George
|
||||||
- Fix error cases when udp-connect is set and send() returns an error
|
- Fix error cases when udp-connect is set and send() returns an error
|
||||||
(modified patch from Xin Li @delphij).
|
(modified patch from Xin Li @delphij).
|
||||||
|
|
|
||||||
|
|
@ -3230,6 +3230,7 @@ comm_point_create_udp(struct comm_base *base, int fd, sldns_buffer* buffer,
|
||||||
comm_point_delete(c);
|
comm_point_delete(c);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3289,6 +3290,7 @@ comm_point_create_udp_ancil(struct comm_base *base, int fd,
|
||||||
comm_point_delete(c);
|
comm_point_delete(c);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3573,6 +3575,7 @@ comm_point_create_tcp(struct comm_base *base, int fd, int num,
|
||||||
comm_point_delete(c);
|
comm_point_delete(c);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
/* now prealloc the handlers */
|
/* now prealloc the handlers */
|
||||||
for(i=0; i<num; i++) {
|
for(i=0; i<num; i++) {
|
||||||
if(port_type == listen_type_tcp ||
|
if(port_type == listen_type_tcp ||
|
||||||
|
|
@ -3796,6 +3799,7 @@ comm_point_create_local(struct comm_base *base, int fd, size_t bufsize,
|
||||||
free(c);
|
free(c);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3858,6 +3862,7 @@ comm_point_create_raw(struct comm_base* base, int fd, int writing,
|
||||||
free(c);
|
free(c);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3868,8 +3873,11 @@ comm_point_close(struct comm_point* c)
|
||||||
return;
|
return;
|
||||||
if(c->fd != -1) {
|
if(c->fd != -1) {
|
||||||
verbose(5, "comm_point_close of %d: event_del", c->fd);
|
verbose(5, "comm_point_close of %d: event_del", c->fd);
|
||||||
if(ub_event_del(c->ev->ev) != 0) {
|
if(c->event_added) {
|
||||||
log_err("could not event_del on close");
|
if(ub_event_del(c->ev->ev) != 0) {
|
||||||
|
log_err("could not event_del on close");
|
||||||
|
}
|
||||||
|
c->event_added = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tcl_close_connection(c->tcl_addr);
|
tcl_close_connection(c->tcl_addr);
|
||||||
|
|
@ -4018,8 +4026,11 @@ void
|
||||||
comm_point_stop_listening(struct comm_point* c)
|
comm_point_stop_listening(struct comm_point* c)
|
||||||
{
|
{
|
||||||
verbose(VERB_ALGO, "comm point stop listening %d", c->fd);
|
verbose(VERB_ALGO, "comm point stop listening %d", c->fd);
|
||||||
if(ub_event_del(c->ev->ev) != 0) {
|
if(c->event_added) {
|
||||||
log_err("event_del error to stoplisten");
|
if(ub_event_del(c->ev->ev) != 0) {
|
||||||
|
log_err("event_del error to stoplisten");
|
||||||
|
}
|
||||||
|
c->event_added = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4032,6 +4043,12 @@ comm_point_start_listening(struct comm_point* c, int newfd, int msec)
|
||||||
/* no use to start listening no free slots. */
|
/* no use to start listening no free slots. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(c->event_added) {
|
||||||
|
if(ub_event_del(c->ev->ev) != 0) {
|
||||||
|
log_err("event_del error to startlisten");
|
||||||
|
}
|
||||||
|
c->event_added = 0;
|
||||||
|
}
|
||||||
if(msec != -1 && msec != 0) {
|
if(msec != -1 && msec != 0) {
|
||||||
if(!c->timeout) {
|
if(!c->timeout) {
|
||||||
c->timeout = (struct timeval*)malloc(sizeof(
|
c->timeout = (struct timeval*)malloc(sizeof(
|
||||||
|
|
@ -4071,13 +4088,17 @@ comm_point_start_listening(struct comm_point* c, int newfd, int msec)
|
||||||
if(ub_event_add(c->ev->ev, msec==0?NULL:c->timeout) != 0) {
|
if(ub_event_add(c->ev->ev, msec==0?NULL:c->timeout) != 0) {
|
||||||
log_err("event_add failed. in cpsl.");
|
log_err("event_add failed. in cpsl.");
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr)
|
void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr)
|
||||||
{
|
{
|
||||||
verbose(VERB_ALGO, "comm point listen_for_rw %d %d", c->fd, wr);
|
verbose(VERB_ALGO, "comm point listen_for_rw %d %d", c->fd, wr);
|
||||||
if(ub_event_del(c->ev->ev) != 0) {
|
if(c->event_added) {
|
||||||
log_err("event_del error to cplf");
|
if(ub_event_del(c->ev->ev) != 0) {
|
||||||
|
log_err("event_del error to cplf");
|
||||||
|
}
|
||||||
|
c->event_added = 0;
|
||||||
}
|
}
|
||||||
ub_event_del_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
|
ub_event_del_bits(c->ev->ev, UB_EV_READ|UB_EV_WRITE);
|
||||||
if(rd) ub_event_add_bits(c->ev->ev, UB_EV_READ);
|
if(rd) ub_event_add_bits(c->ev->ev, UB_EV_READ);
|
||||||
|
|
@ -4085,6 +4106,7 @@ void comm_point_listen_for_rw(struct comm_point* c, int rd, int wr)
|
||||||
if(ub_event_add(c->ev->ev, c->timeout) != 0) {
|
if(ub_event_add(c->ev->ev, c->timeout) != 0) {
|
||||||
log_err("event_add failed. in cplf.");
|
log_err("event_add failed. in cplf.");
|
||||||
}
|
}
|
||||||
|
c->event_added = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t comm_point_get_mem(struct comm_point* c)
|
size_t comm_point_get_mem(struct comm_point* c)
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,8 @@ struct comm_reply {
|
||||||
struct comm_point {
|
struct comm_point {
|
||||||
/** behind the scenes structure, with say libevent info. alloced. */
|
/** behind the scenes structure, with say libevent info. alloced. */
|
||||||
struct internal_event* ev;
|
struct internal_event* ev;
|
||||||
|
/** if the event is added or not */
|
||||||
|
int event_added;
|
||||||
|
|
||||||
/** file descriptor for communication point */
|
/** file descriptor for communication point */
|
||||||
int fd;
|
int fd;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue