]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
SNMP: Do not send responses that we fail to encode (#2151)
authorAlex Rousskov <rousskov@measurement-factory.com>
Mon, 8 Sep 2025 08:05:00 +0000 (08:05 +0000)
committerSquid Anubis <squid-anubis@squid-cache.org>
Mon, 8 Sep 2025 08:05:07 +0000 (08:05 +0000)
When snmp_build() fails, its output buffer must not be used:

    Syscall param sendto() points to uninitialised byte(s)
        by xsendto() (socket.h:118)
        by comm_udp_sendto() (comm.cc:923)
        by snmpConstructReponse() (snmp_core.cc:449)

Also inform the admin about SNMP encoding failures.

src/snmp/Forwarder.cc
src/snmp/Inquirer.cc
src/snmp_core.cc

index 7cdbe2ee62ea24f95f2a61ea4e61576160898ba0..b1321718b48e24c9bd627269d90adffad00ec61d 100644 (file)
@@ -87,8 +87,10 @@ Snmp::Forwarder::sendError(int error)
     req.pdu.errstat = error;
     u_char buffer[SNMP_REQUEST_SIZE];
     int len = sizeof(buffer);
-    snmp_build(&req.session, &req.pdu, buffer, &len);
-    comm_udp_sendto(fd, req.address, buffer, len);
+    if (snmp_build(&req.session, &req.pdu, buffer, &len) == 0)
+        comm_udp_sendto(fd, req.address, buffer, len);
+    else
+        debugs(49, DBG_IMPORTANT, "ERROR: Failed to encode an error response to SNMP agent query from " << req.address);
 }
 
 void
index c6499406dacb08f23ba83d8a26ef99596b22f38b..c966b84e809388258870024c1b06ecd5a392d9f1 100644 (file)
@@ -115,7 +115,9 @@ Snmp::Inquirer::sendResponse()
     u_char buffer[SNMP_REQUEST_SIZE];
     int len = sizeof(buffer);
     Snmp::Request& req = static_cast<Snmp::Request&>(*request);
-    snmp_build(&req.session, &aggrPdu, buffer, &len);
-    comm_udp_sendto(conn->fd, req.address, buffer, len);
+    if (snmp_build(&req.session, &aggrPdu, buffer, &len) == 0)
+        comm_udp_sendto(conn->fd, req.address, buffer, len);
+    else
+        debugs(49, DBG_IMPORTANT, "ERROR: Failed to encode a response to SNMP agent query from " << req.address);
 }
 
index db78b1164fa58757dba5e8338d0aaf82d9fe0c19..dc130d45c80f565b3714d9ed9b4c4cefc229ecc3 100644 (file)
@@ -453,8 +453,10 @@ snmpConstructReponse(SnmpRequest * rq)
     snmp_free_pdu(rq->PDU);
 
     if (RespPDU != nullptr) {
-        snmp_build(&rq->session, RespPDU, rq->outbuf, &rq->outlen);
-        comm_udp_sendto(rq->sock, rq->from, rq->outbuf, rq->outlen);
+        if (snmp_build(&rq->session, RespPDU, rq->outbuf, &rq->outlen) == 0)
+            comm_udp_sendto(rq->sock, rq->from, rq->outbuf, rq->outlen);
+        else
+            debugs(49, DBG_IMPORTANT, "ERROR: Failed to encode a response to SNMP agent query from " << rq->from);
         snmp_free_pdu(RespPDU);
     }
 }