From: Vladimír Čunát Date: Thu, 12 Sep 2024 12:54:16 +0000 (+0200) Subject: daemon/session2: try to avoid triggering Coverity X-Git-Tag: v6.0.9~16^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f170a809a362093a9a010b0ac37d259534dc26f;p=thirdparty%2Fknot-resolver.git daemon/session2: try to avoid triggering Coverity Strictly speaking, the .ip member is on 16 bytes long, so it doesn't suffice in case it's an IPv6. Practically it doesn't matter, as there's the union containing all this. Either way, I think it's cleaner to copy to the whole union. Also we don't support it in this case, but theoretically e.g. an AF_UNIX could happen, so let's be defensive and guard by kr_require(). --- diff --git a/daemon/session2.c b/daemon/session2.c index 8980ec0db..217c06eb5 100644 --- a/daemon/session2.c +++ b/daemon/session2.c @@ -608,18 +608,21 @@ static int session2_submit( if (had_comm_param) { struct comm_addr_storage *addrst = &ctx->comm_addr_storage; if (comm->src_addr) { - memcpy(&addrst->src_addr.ip, comm->src_addr, - kr_sockaddr_len(comm->src_addr)); + int len = kr_sockaddr_len(comm->src_addr); + kr_require(len > 0 && len <= sizeof(union kr_sockaddr)); + memcpy(&addrst->src_addr, comm->src_addr, len); ctx->comm_storage.src_addr = &addrst->src_addr.ip; } if (comm->comm_addr) { - memcpy(&addrst->comm_addr.ip, comm->comm_addr, - kr_sockaddr_len(comm->comm_addr)); + int len = kr_sockaddr_len(comm->comm_addr); + kr_require(len > 0 && len <= sizeof(union kr_sockaddr)); + memcpy(&addrst->comm_addr, comm->comm_addr, len); ctx->comm_storage.comm_addr = &addrst->comm_addr.ip; } if (comm->dst_addr) { - memcpy(&addrst->dst_addr.ip, comm->dst_addr, - kr_sockaddr_len(comm->dst_addr)); + int len = kr_sockaddr_len(comm->dst_addr); + kr_require(len > 0 && len <= sizeof(union kr_sockaddr)); + memcpy(&addrst->dst_addr, comm->dst_addr, len); ctx->comm_storage.dst_addr = &addrst->dst_addr.ip; } ctx->comm = &ctx->comm_storage;