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

Reply via email to