Hi,

In relayd, if a relay is configured with two "listen on" directives, one
with ssl and one without. In the relay_inherit function the ssl pointers
(cert and key) are copied to the latter, and used/freed even if F_SSL is
not set. This causes a double free later in purge_relay.

relay "http" {
        listen on 127.0.0.1 port 4433 ssl
        listen on 127.0.0.1 port 8080
        forward with ssl to 127.0.0.1 port 443
}

There following patch fixes this.

--- usr.sbin/relayd/parse.y.orig        Tue Nov 19 22:10:48 2013
+++ usr.sbin/relayd/parse.y     Tue Nov 19 22:09:41 2013
@@ -2809,6 +2809,12 @@
        rb->rl_conf.port = rc.port;
        rb->rl_conf.flags =
            (ra->rl_conf.flags & ~F_SSL) | (rc.flags & F_SSL);
+       if (!(rb->rl_conf.flags & F_SSL)) {
+               rb->rl_ssl_cert = NULL;
+               rb->rl_conf.ssl_cert_len = 0;
+               rb->rl_ssl_key = NULL;
+               rb->rl_conf.ssl_key_len = 0;
+       }
        TAILQ_INIT(&rb->rl_tables);

        rb->rl_conf.id = ++last_relay_id;

Reply via email to