Hi!

config_setrelay>relay_privinit>relay_udp_privinit doesn't set env
since env isn't set in relay.c yet, causing dns relay to SIGSEGV
in relay_udp_server. Move setting env to relay_udp_init.

Rivo

Index: usr.sbin/relayd/relay.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relay.c,v
retrieving revision 1.221
diff -u -p -r1.221 relay.c
--- usr.sbin/relayd/relay.c     28 May 2017 10:39:15 -0000      1.221
+++ usr.sbin/relayd/relay.c     29 Jun 2017 20:58:08 -0000
@@ -285,7 +285,7 @@ relay_privinit(struct relay *rlay)
 
        switch (rlay->rl_proto->type) {
        case RELAY_PROTO_DNS:
-               relay_udp_privinit(env, rlay);
+               relay_udp_privinit(rlay);
                break;
        case RELAY_PROTO_TCP:
                break;
@@ -445,7 +445,7 @@ relay_launch(void)
 
                switch (rlay->rl_proto->type) {
                case RELAY_PROTO_DNS:
-                       relay_udp_init(rlay);
+                       relay_udp_init(env, rlay);
                        break;
                case RELAY_PROTO_TCP:
                case RELAY_PROTO_HTTP:
Index: usr.sbin/relayd/relay_udp.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relay_udp.c,v
retrieving revision 1.46
diff -u -p -r1.46 relay_udp.c
--- usr.sbin/relayd/relay_udp.c 28 May 2017 10:39:15 -0000      1.46
+++ usr.sbin/relayd/relay_udp.c 29 Jun 2017 20:58:08 -0000
@@ -58,20 +58,20 @@ void                 relay_dns_result(struct rsession 
 int             relay_dns_cmp(struct rsession *, struct rsession *);
 
 void
-relay_udp_privinit(struct relayd *x_env, struct relay *rlay)
+relay_udp_privinit(struct relay *rlay)
 {
-       if (env == NULL)
-               env = x_env;
-
        if (rlay->rl_conf.flags & F_TLS)
                fatalx("tls over udp is not supported");
        rlay->rl_conf.flags |= F_UDP;
 }
 
 void
-relay_udp_init(struct relay *rlay)
+relay_udp_init(struct relayd *x_env, struct relay *rlay)
 {
        struct protocol         *proto = rlay->rl_proto;
+
+       if (env == NULL)
+               env = x_env;
 
        switch (proto->type) {
        case RELAY_PROTO_DNS:
Index: usr.sbin/relayd/relayd.h
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relayd.h,v
retrieving revision 1.240
diff -u -p -r1.240 relayd.h
--- usr.sbin/relayd/relayd.h    27 May 2017 08:33:25 -0000      1.240
+++ usr.sbin/relayd/relayd.h    29 Jun 2017 20:58:08 -0000
@@ -1218,8 +1218,8 @@ int        relay_httpdesc_init(struct ctl_rela
 ssize_t         relay_http_time(time_t, char *, size_t);
 
 /* relay_udp.c */
-void    relay_udp_privinit(struct relayd *, struct relay *);
-void    relay_udp_init(struct relay *);
+void    relay_udp_privinit(struct relay *);
+void    relay_udp_init(struct relayd *, struct relay *);
 int     relay_udp_bind(struct sockaddr_storage *, in_port_t,
            struct protocol *);
 void    relay_udp_server(int, short, void *);


Reply via email to