]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-snmp.c
Squelch a Coverity warning.
[tcpdump] / print-snmp.c
index 40d559da4bbb91180fe4a4a0e9d27ccfc9f5948b..a2aa0742d201fb5b14a06d56b28d52eafa413105 100644 (file)
  #     @(#)snmp.awk.x  1.1 (LANL) 1/15/90
  */
 
-#define NETDISSECT_REWORKED
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
-#include <tcpdump-stdinc.h>
+#include <netdissect-stdinc.h>
 
 #include <stdio.h>
 #include <string.h>
 
-#ifdef HAVE_SMI_H
+#ifdef USE_LIBSMI
 #include <smi.h>
 #endif
 
-#include "interface.h"
+#include "netdissect.h"
 
 #undef OPAQUE  /* defined in <wingdi.h> */
 
@@ -325,7 +324,7 @@ static const struct obj_abrev {
 struct be {
        uint32_t asnlen;
        union {
-               caddr_t raw;
+               const uint8_t *raw;
                int32_t integer;
                uint32_t uns;
                const u_char *str;
@@ -525,7 +524,7 @@ asn1_parse(netdissect_options *ndo,
 
                        case OBJECTID:
                                elem->type = BE_OID;
-                               elem->data.raw = (caddr_t)p;
+                               elem->data.raw = (const uint8_t *)p;
                                break;
 
                        case ASN_NULL:
@@ -535,7 +534,7 @@ asn1_parse(netdissect_options *ndo,
 
                        default:
                                elem->type = BE_OCTET;
-                               elem->data.raw = (caddr_t)p;
+                               elem->data.raw = (const uint8_t *)p;
                                ND_PRINT((ndo, "[P/U/%s]", Class[class].Id[id]));
                                break;
                        }
@@ -545,7 +544,7 @@ asn1_parse(netdissect_options *ndo,
                        switch (id) {
                        case IPADDR:
                                elem->type = BE_INETADDR;
-                               elem->data.raw = (caddr_t)p;
+                               elem->data.raw = (const uint8_t *)p;
                                break;
 
                        case COUNTER:
@@ -578,7 +577,7 @@ asn1_parse(netdissect_options *ndo,
 
                        default:
                                elem->type = BE_OCTET;
-                               elem->data.raw = (caddr_t)p;
+                               elem->data.raw = (const uint8_t *)p;
                                ND_PRINT((ndo, "[P/A/%s]",
                                        Class[class].Id[id]));
                                break;
@@ -608,7 +607,7 @@ asn1_parse(netdissect_options *ndo,
                        ND_PRINT((ndo, "[P/%s/%s]", Class[class].name, Class[class].Id[id]));
                        ND_TCHECK2(*p, elem->asnlen);
                        elem->type = BE_OCTET;
-                       elem->data.raw = (caddr_t)p;
+                       elem->data.raw = (const uint8_t *)p;
                        break;
                }
                break;
@@ -619,12 +618,12 @@ asn1_parse(netdissect_options *ndo,
                        switch (id) {
                        case SEQUENCE:
                                elem->type = BE_SEQ;
-                               elem->data.raw = (caddr_t)p;
+                               elem->data.raw = (const uint8_t *)p;
                                break;
 
                        default:
                                elem->type = BE_OCTET;
-                               elem->data.raw = (caddr_t)p;
+                               elem->data.raw = (const uint8_t *)p;
                                ND_PRINT((ndo, "C/U/%s", Class[class].Id[id]));
                                break;
                        }
@@ -632,12 +631,12 @@ asn1_parse(netdissect_options *ndo,
 
                case CONTEXT:
                        elem->type = BE_PDU;
-                       elem->data.raw = (caddr_t)p;
+                       elem->data.raw = (const uint8_t *)p;
                        break;
 
                default:
                        elem->type = BE_OCTET;
-                       elem->data.raw = (caddr_t)p;
+                       elem->data.raw = (const uint8_t *)p;
                        ND_PRINT((ndo, "C/%s/%s", Class[class].name, Class[class].Id[id]));
                        break;
                }
@@ -661,7 +660,7 @@ static int
 asn1_print(netdissect_options *ndo,
            struct be *elem)
 {
-       u_char *p = (u_char *)elem->data.raw;
+       const u_char *p = (const u_char *)elem->data.raw;
        uint32_t asnlen = elem->asnlen;
        uint32_t i;
 
@@ -677,14 +676,15 @@ asn1_print(netdissect_options *ndo,
                break;
 
        case BE_OID: {
-               int o = 0, first = -1, i = asnlen;
+               int o = 0, first = -1;
 
-               if (!ndo->ndo_sflag && !ndo->ndo_nflag && asnlen > 2) {
+               i = asnlen;
+               if (!ndo->ndo_mflag && !ndo->ndo_nflag && asnlen > 2) {
                        const struct obj_abrev *a = &obj_abrev_list[0];
                        size_t a_len = strlen(a->oid);
                        for (; a->node; a++) {
                                ND_TCHECK2(*p, a_len);
-                               if (memcmp(a->oid, (char *)p, a_len) == 0) {
+                               if (memcmp(a->oid, p, a_len) == 0) {
                                        objp = a->node->child;
                                        i -= strlen(a->oid);
                                        p += strlen(a->oid);
@@ -695,7 +695,7 @@ asn1_print(netdissect_options *ndo,
                        }
                }
 
-               for (; !ndo->ndo_sflag && i-- > 0; p++) {
+               for (; !ndo->ndo_mflag && i-- > 0; p++) {
                        ND_TCHECK(*p);
                        o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8);
                        if (*p & ASN_LONGLEN)
@@ -775,7 +775,8 @@ asn1_print(netdissect_options *ndo,
 
        case BE_STR: {
                register int printable = 1, first = 1;
-               const u_char *p = elem->data.str;
+
+               p = elem->data.str;
                ND_TCHECK2(*p, asnlen);
                for (i = asnlen; printable && i-- > 0; p++)
                        printable = ND_ISPRINT(*p);
@@ -867,7 +868,7 @@ asn1_decode(u_char *p, u_int length)
 }
 #endif
 
-#ifdef LIBSMI
+#ifdef USE_LIBSMI
 
 struct smi2be {
     SmiBasetype basetype;
@@ -895,11 +896,12 @@ smi_decode_oid(netdissect_options *ndo,
                struct be *elem, unsigned int *oid,
                unsigned int oidsize, unsigned int *oidlen)
 {
-       u_char *p = (u_char *)elem->data.raw;
+       const u_char *p = (const u_char *)elem->data.raw;
        uint32_t asnlen = elem->asnlen;
        int o = 0, first = -1, i = asnlen;
+       unsigned int firstval;
 
-       for (*oidlen = 0; ndo->ndo_sflag && i-- > 0; p++) {
+       for (*oidlen = 0; ndo->ndo_mflag && i-- > 0; p++) {
                ND_TCHECK(*p);
                o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8);
                if (*p & ASN_LONGLEN)
@@ -911,12 +913,12 @@ smi_decode_oid(netdissect_options *ndo,
                 */
                if (first < 0) {
                        first = 0;
+                       firstval = o / OIDMUX;
+                       if (firstval > 2) firstval = 2;
+                       o -= firstval * OIDMUX;
                        if (*oidlen < oidsize) {
-                           oid[*oidlen] = o / OIDMUX;
-                           if (oid[*oidlen] > 2) oid[*oidlen] = 2;
+                           oid[(*oidlen)++] = firstval;
                        }
-                       o -= oid[*oidlen] * OIDMUX;
-                       if (*oidlen < oidsize) (*oidlen)++;
                }
                if (*oidlen < oidsize) {
                        oid[(*oidlen)++] = o;
@@ -1052,7 +1054,7 @@ smi_print_variable(netdissect_options *ndo,
 
 static int
 smi_print_value(netdissect_options *ndo,
-                SmiNode *smiNode, u_char pduid, struct be *elem)
+                SmiNode *smiNode, u_short pduid, struct be *elem)
 {
        unsigned int i, oid[128], oidlen;
        SmiType *smiType;
@@ -1195,11 +1197,11 @@ smi_print_value(netdissect_options *ndo,
  */
 static void
 varbind_print(netdissect_options *ndo,
-              u_char pduid, const u_char *np, u_int length)
+              u_short pduid, const u_char *np, u_int length)
 {
        struct be elem;
        int count = 0, ind;
-#ifdef LIBSMI
+#ifdef USE_LIBSMI
        SmiNode *smiNode = NULL;
 #endif
        int status;
@@ -1216,7 +1218,7 @@ varbind_print(netdissect_options *ndo,
                ND_PRINT((ndo, "[%d extra after SEQ of varbind]", length - count));
        /* descend */
        length = elem.asnlen;
-       np = (u_char *)elem.data.raw;
+       np = (const u_char *)elem.data.raw;
 
        for (ind = 1; length > 0; ind++) {
                const u_char *vbend;
@@ -1236,7 +1238,7 @@ varbind_print(netdissect_options *ndo,
                vblength = length - count;
                /* descend */
                length = elem.asnlen;
-               np = (u_char *)elem.data.raw;
+               np = (const u_char *)elem.data.raw;
 
                /* objName (OID) */
                if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
@@ -1246,7 +1248,7 @@ varbind_print(netdissect_options *ndo,
                        asn1_print(ndo, &elem);
                        return;
                }
-#ifdef LIBSMI
+#ifdef USE_LIBSMI
                smiNode = smi_print_variable(ndo, &elem, &status);
 #else
                status = asn1_print(ndo, &elem);
@@ -1272,7 +1274,7 @@ varbind_print(netdissect_options *ndo,
                        }
                } else {
                        if (elem.type != BE_NULL) {
-#ifdef LIBSMI
+#ifdef USE_LIBSMI
                                status = smi_print_value(ndo, smiNode, pduid, &elem);
 #else
                                status = asn1_print(ndo, &elem);
@@ -1295,7 +1297,7 @@ snmppdu_print(netdissect_options *ndo,
               u_short pduid, const u_char *np, u_int length)
 {
        struct be elem;
-       int count = 0, error;
+       int count = 0, error_status;
 
        /* reqId (Integer) */
        if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
@@ -1318,7 +1320,7 @@ snmppdu_print(netdissect_options *ndo,
                asn1_print(ndo, &elem);
                return;
        }
-       error = 0;
+       error_status = 0;
        if ((pduid == GETREQ || pduid == GETNEXTREQ || pduid == SETREQ
            || pduid == INFORMREQ || pduid == V2TRAP || pduid == REPORT)
            && elem.data.integer != 0) {
@@ -1330,7 +1332,7 @@ snmppdu_print(netdissect_options *ndo,
        } else if (elem.data.integer != 0) {
                char errbuf[20];
                ND_PRINT((ndo, " %s", DECODE_ErrorStatus(elem.data.integer)));
-               error = elem.data.integer;
+               error_status = elem.data.integer;
        }
        length -= count;
        np += count;
@@ -1350,15 +1352,12 @@ snmppdu_print(netdissect_options *ndo,
        else if (pduid == GETBULKREQ)
                ND_PRINT((ndo, " M=%d", elem.data.integer));
        else if (elem.data.integer != 0) {
-               if (!error)
+               if (!error_status)
                        ND_PRINT((ndo, "[errorIndex(%d) w/o errorStatus]", elem.data.integer));
-               else {
+               else
                        ND_PRINT((ndo, "@%d", elem.data.integer));
-                       error = elem.data.integer;
-               }
-       } else if (error) {
+       } else if (error_status) {
                ND_PRINT((ndo, "[errorIndex==0]"));
-               error = 0;
        }
        length -= count;
        np += count;
@@ -1485,7 +1484,7 @@ pdu_print(netdissect_options *ndo,
        ND_PRINT((ndo, " "));
        /* descend into PDU */
        length = pdu.asnlen;
-       np = (u_char *)pdu.data.raw;
+       np = (const u_char *)pdu.data.raw;
 
        if (version == SNMP_VERSION_1 &&
            (pdu.id == GETBULKREQ || pdu.id == INFORMREQ ||
@@ -1539,7 +1538,7 @@ scopedpdu_print(netdissect_options *ndo,
                return;
        }
        length = elem.asnlen;
-       np = (u_char *)elem.data.raw;
+       np = (const u_char *)elem.data.raw;
 
        /* contextEngineID (OCTET STRING) */
        if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
@@ -1594,7 +1593,7 @@ community_print(netdissect_options *ndo,
        }
        /* default community */
        if (!(elem.asnlen == sizeof(DEF_COMMUNITY) - 1 &&
-           strncmp((char *)elem.data.str, DEF_COMMUNITY,
+           strncmp((const char *)elem.data.str, DEF_COMMUNITY,
                    sizeof(DEF_COMMUNITY) - 1) == 0))
                /* ! "public" */
                ND_PRINT((ndo, "C=%.*s ", (int)elem.asnlen, elem.data.str));
@@ -1623,7 +1622,7 @@ usm_print(netdissect_options *ndo,
                return;
        }
        length = elem.asnlen;
-       np = (u_char *)elem.data.raw;
+       np = (const u_char *)elem.data.raw;
 
        /* msgAuthoritativeEngineID (OCTET STRING) */
        if ((count = asn1_parse(ndo, np, length, &elem)) < 0)
@@ -1724,7 +1723,7 @@ v3msg_print(netdissect_options *ndo,
                return;
        }
        length = elem.asnlen;
-       np = (u_char *)elem.data.raw;
+       np = (const u_char *)elem.data.raw;
 
        if (ndo->ndo_vflag) {
                ND_PRINT((ndo, "{ "));
@@ -1863,7 +1862,7 @@ snmp_print(netdissect_options *ndo,
                ND_PRINT((ndo, "[%d extra after iSEQ]", length - count));
        /* descend */
        length = elem.asnlen;
-       np = (u_char *)elem.data.raw;
+       np = (const u_char *)elem.data.raw;
 
        /* Version (INTEGER) */
        if ((count = asn1_parse(ndo, np, length, &elem)) < 0)