resolve: use structured initializer

This fixes the following valgrind warning:
```
Syscall param sendmsg(msg.msg_name) points to uninitialised byte(s)
   at 0x6189CC1: sendmsg (in /usr/lib64/libpthread-2.27.so)
   by 0x153082: dns_stream_writev (resolved-dns-stream.c:235)
   by 0x153343: dns_stream_tls_writev (resolved-dns-stream.c:299)
   by 0x5B30343: ??? (in /usr/lib64/libgnutls.so.30.20.2)
   by 0x5B3158F: ??? (in /usr/lib64/libgnutls.so.30.20.2)
   by 0x5B33190: ??? (in /usr/lib64/libgnutls.so.30.20.2)
   by 0x5B36307: ??? (in /usr/lib64/libgnutls.so.30.20.2)
   by 0x5B37D47: gnutls_handshake (in /usr/lib64/libgnutls.so.30.20.2)
   by 0x154591: dns_stream_connect_tls (resolved-dns-stream.c:596)
   by 0x13A889: dns_transaction_emit_tcp (resolved-dns-transaction.c:676)
   by 0x13D901: dns_transaction_go (resolved-dns-transaction.c:1761)
   by 0x1330C8: dns_query_candidate_go (resolved-dns-query.c:156)
 Address 0xa9ac268 is 312 bytes inside a block of size 592 alloc'd
   at 0x4C30B06: calloc (vg_replace_malloc.c:711)
   by 0x1541F8: dns_stream_new (resolved-dns-stream.c:545)
   by 0x13A662: dns_transaction_emit_tcp (resolved-dns-transaction.c:642)
   by 0x13D901: dns_transaction_go (resolved-dns-transaction.c:1761)
   by 0x1330C8: dns_query_candidate_go (resolved-dns-query.c:156)
   by 0x134E16: dns_query_go (resolved-dns-query.c:757)
   by 0x11F3FB: bus_method_resolve_hostname (resolved-bus.c:353)
   by 0x4F947A7: method_callbacks_run (bus-objects.c:402)
   by 0x4F97266: object_find_and_run (bus-objects.c:1260)
   by 0x4F978B1: bus_process_object (bus-objects.c:1376)
   by 0x4FAF82C: process_message (sd-bus.c:2661)
   by 0x4FAFA1B: process_running (sd-bus.c:2703)
```
This commit is contained in:
Yu Watanabe 2018-07-12 13:37:01 +09:00
parent 18df5fb017
commit 7b3bae217e

View file

@ -324,36 +324,54 @@ static int dns_scope_socket(
ifindex = dns_server_ifindex(server);
sa.sa.sa_family = server->family;
if (server->family == AF_INET) {
sa.in.sin_port = htobe16(port);
sa.in.sin_addr = server->address.in;
switch (server->family) {
case AF_INET:
sa = (union sockaddr_union) {
.in.sin_family = server->family,
.in.sin_port = htobe16(port),
.in.sin_addr = server->address.in,
};
salen = sizeof(sa.in);
} else if (server->family == AF_INET6) {
sa.in6.sin6_port = htobe16(port);
sa.in6.sin6_addr = server->address.in6;
sa.in6.sin6_scope_id = ifindex;
break;
case AF_INET6:
sa = (union sockaddr_union) {
.in6.sin6_family = server->family,
.in6.sin6_port = htobe16(port),
.in6.sin6_addr = server->address.in6,
.in6.sin6_scope_id = ifindex,
};
salen = sizeof(sa.in6);
} else
break;
default:
return -EAFNOSUPPORT;
}
} else {
assert(family != AF_UNSPEC);
assert(address);
sa.sa.sa_family = family;
ifindex = s->link ? s->link->ifindex : 0;
if (family == AF_INET) {
sa.in.sin_port = htobe16(port);
sa.in.sin_addr = address->in;
switch (family) {
case AF_INET:
sa = (union sockaddr_union) {
.in.sin_family = family,
.in.sin_port = htobe16(port),
.in.sin_addr = address->in,
};
salen = sizeof(sa.in);
} else if (family == AF_INET6) {
sa.in6.sin6_port = htobe16(port);
sa.in6.sin6_addr = address->in6;
sa.in6.sin6_scope_id = ifindex;
break;
case AF_INET6:
sa = (union sockaddr_union) {
.in6.sin6_family = family,
.in6.sin6_port = htobe16(port),
.in6.sin6_addr = address->in6,
.in6.sin6_scope_id = ifindex,
};
salen = sizeof(sa.in6);
} else
break;
default:
return -EAFNOSUPPORT;
}
}
fd = socket(sa.sa.sa_family, type|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);