Hello tech@
There is a bug in relayd which is related to udp relays.
It can be triggered with the following relayd.conf:
relayd_addr="192.168.10.2"
relayd_port="53"
table <dns_servers> { 10.10.10.2 }
dns_servers_port="53"
interval 10
timeout 200
dns protocol "dnsfilter" {
tcp { nodelay, sack, socket buffer 1024, backlog 1000 }
}
relay dnsproxy {
listen on $relayd_addr port $relayd_port
protocol "dnsfilter"
forward to <dns_servers> port $dns_servers_port \
mode loadbalance check tcp
}
nslookup via 192.168.10.2 triggers a coredump in relayd.
The problem is within relay_dns_request() in relay_udp.c,
env is a NULL pointer but &env->sc_timeout is used in event_again().
Here is my patch:
--- relay_udp.c.orig Mon Feb 13 16:29:07 2012
+++ relay_udp.c Mon Feb 13 16:32:20 2012
@@ -474,6 +474,8 @@
if (gettimeofday(&con->se_tv_start, NULL) == -1)
return (-1);
+ bcopy( &rlay->rl_conf.timeout, & con->se_timeout, sizeof(
con->se_timeout ));
+
if (rlay->rl_dsttable != NULL) {
if (relay_from_table(con) != 0)
return (-1);
@@ -508,7 +510,7 @@
}
event_again(&con->se_ev, con->se_out.s, EV_TIMEOUT|EV_READ,
- relay_udp_response, &con->se_tv_start, &env->sc_timeout, con);
+ relay_udp_response, &con->se_tv_start, &con->se_timeout, con);
return (0);
}
Best regards,
Tom