]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
daemon/session2: try to avoid triggering Coverity
authorVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 12 Sep 2024 12:54:16 +0000 (14:54 +0200)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 12 Sep 2024 13:37:21 +0000 (15:37 +0200)
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().

daemon/session2.c

index 8980ec0dbf474541c55870d2dd2c73f82f17b342..217c06eb5949febb36487cfa253968fd82aedfc8 100644 (file)
@@ -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;