X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/67b7b0a0e8287303eb76a165fd2b211056615c37..0f328b4aa16b0b47f05a85c440ce1d07719e3cac:/print-snmp.c?ds=sidebyside diff --git a/print-snmp.c b/print-snmp.c index 69b6a13f..1e098dbd 100644 --- a/print-snmp.c +++ b/print-snmp.c @@ -72,6 +72,7 @@ #endif #include "netdissect.h" +#include "extract.h" #undef OPAQUE /* defined in */ @@ -428,7 +429,7 @@ asn1_parse(netdissect_options *ndo, ND_PRINT((ndo, "[nothing to parse]")); return -1; } - ND_TCHECK(*p); + ND_TCHECK_1(p); /* * it would be nice to use a bit field, but you can't depend on them. @@ -437,14 +438,14 @@ asn1_parse(netdissect_options *ndo, * +---+---+---+---+---+---+---+---+ * 7 6 5 4 3 2 1 0 */ - id = *p & ASN_ID_BITS; /* lower 5 bits, range 00-1f */ + id = EXTRACT_U_1(p) & ASN_ID_BITS; /* lower 5 bits, range 00-1f */ #ifdef notdef - form = (*p & 0xe0) >> 5; /* move upper 3 bits to lower 3 */ + form = (EXTRACT_U_1(p) & 0xe0) >> 5; /* move upper 3 bits to lower 3 */ class = form >> 1; /* bits 7&6 -> bits 1&0, range 0-3 */ form &= 0x1; /* bit 5 -> bit 0, range 0-1 */ #else - form = (u_char)(*p & ASN_FORM_BITS) >> ASN_FORM_SHIFT; - class = (u_char)(*p & ASN_CLASS_BITS) >> ASN_CLASS_SHIFT; + form = (u_char)(EXTRACT_U_1(p) & ASN_FORM_BITS) >> ASN_FORM_SHIFT; + class = (u_char)(EXTRACT_U_1(p) & ASN_CLASS_BITS) >> ASN_CLASS_SHIFT; #endif elem->form = form; elem->class = class; @@ -463,24 +464,24 @@ asn1_parse(netdissect_options *ndo, * that won't fit in 32 bits. */ id = 0; - ND_TCHECK(*p); - while (*p & ASN_BIT8) { + ND_TCHECK_1(p); + while (EXTRACT_U_1(p) & ASN_BIT8) { if (len < 1) { ND_PRINT((ndo, "[Xtagfield?]")); return -1; } - id = (id << 7) | (*p & ~ASN_BIT8); + id = (id << 7) | (EXTRACT_U_1(p) & ~ASN_BIT8); len--; hdr++; p++; - ND_TCHECK(*p); + ND_TCHECK_1(p); } if (len < 1) { ND_PRINT((ndo, "[Xtagfield?]")); return -1; } - ND_TCHECK(*p); - elem->id = id = (id << 7) | *p; + ND_TCHECK_1(p); + elem->id = id = (id << 7) | EXTRACT_U_1(p); --len; ++hdr; ++p; @@ -489,8 +490,8 @@ asn1_parse(netdissect_options *ndo, ND_PRINT((ndo, "[no asnlen]")); return -1; } - ND_TCHECK(*p); - elem->asnlen = *p; + ND_TCHECK_1(p); + elem->asnlen = EXTRACT_U_1(p); p++; len--; hdr++; if (elem->asnlen & ASN_BIT8) { uint32_t noct = elem->asnlen % ASN_BIT8; @@ -500,8 +501,10 @@ asn1_parse(netdissect_options *ndo, return -1; } ND_TCHECK2(*p, noct); - for (; noct-- > 0; len--, hdr++) - elem->asnlen = (elem->asnlen << ASN_SHIFT8) | *p++; + for (; noct-- > 0; len--, hdr++) { + elem->asnlen = (elem->asnlen << ASN_SHIFT8) | EXTRACT_U_1(p); + p++; + } } if (len < elem->asnlen) { ND_PRINT((ndo, "[len%dasnlen)); @@ -519,6 +522,7 @@ asn1_parse(netdissect_options *ndo, ND_PRINT((ndo, "[id?%c/%s/%d]", *Form[form], Class[class].name, id)); return -1; } + ND_TCHECK2(*p, elem->asnlen); switch (form) { case PRIMITIVE: @@ -539,11 +543,10 @@ asn1_parse(netdissect_options *ndo, ND_PRINT((ndo, "[asnlen=0]")); return -1; } - ND_TCHECK2(*p, elem->asnlen); - if (*p & ASN_BIT8) /* negative */ + if (EXTRACT_U_1(p) & ASN_BIT8) /* negative */ data = -1; for (i = elem->asnlen; i-- > 0; p++) - data = (data << ASN_SHIFT8) | *p; + data = (data << ASN_SHIFT8) | EXTRACT_U_1(p); elem->data.integer = data; break; } @@ -577,22 +580,20 @@ asn1_parse(netdissect_options *ndo, case GAUGE: case TIMETICKS: { register uint32_t data; - ND_TCHECK2(*p, elem->asnlen); elem->type = BE_UNS; data = 0; for (i = elem->asnlen; i-- > 0; p++) - data = (data << 8) + *p; + data = (data << 8) + EXTRACT_U_1(p); elem->data.uns = data; break; } case COUNTER64: { register uint64_t data64; - ND_TCHECK2(*p, elem->asnlen); elem->type = BE_UNS64; data64 = 0; for (i = elem->asnlen; i-- > 0; p++) - data64 = (data64 << 8) + *p; + data64 = (data64 << 8) + EXTRACT_U_1(p); elem->data.uns64 = data64; break; } @@ -627,7 +628,6 @@ asn1_parse(netdissect_options *ndo, default: 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 = (const uint8_t *)p; break; @@ -682,7 +682,7 @@ asn1_print_octets(netdissect_options *ndo, struct be *elem) ND_TCHECK2(*p, asnlen); for (i = asnlen; i-- > 0; p++) - ND_PRINT((ndo, "_%.2x", *p)); + ND_PRINT((ndo, "_%.2x", EXTRACT_U_1(p))); return 0; trunc: @@ -701,7 +701,7 @@ asn1_print_string(netdissect_options *ndo, struct be *elem) p = elem->data.str; ND_TCHECK2(*p, asnlen); for (i = asnlen; printable && i-- > 0; p++) - printable = ND_ISPRINT(*p); + printable = ND_ISPRINT(EXTRACT_U_1(p)); p = elem->data.str; if (printable) { ND_PRINT((ndo, "\"")); @@ -712,7 +712,7 @@ asn1_print_string(netdissect_options *ndo, struct be *elem) ND_PRINT((ndo, "\"")); } else { for (i = asnlen; i-- > 0; p++) { - ND_PRINT((ndo, first ? "%.2x" : "_%.2x", *p)); + ND_PRINT((ndo, first ? "%.2x" : "_%.2x", EXTRACT_U_1(p))); first = 0; } } @@ -770,9 +770,9 @@ asn1_print(netdissect_options *ndo, } for (; i-- > 0; p++) { - ND_TCHECK(*p); - o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8); - if (*p & ASN_LONGLEN) + ND_TCHECK_1(p); + o = (o << ASN_SHIFT7) + (EXTRACT_U_1(p) & ~ASN_BIT8); + if (EXTRACT_U_1(p) & ASN_LONGLEN) continue; /* @@ -825,7 +825,7 @@ asn1_print(netdissect_options *ndo, p = (const u_char *)elem->data.raw; ND_TCHECK2(*p, asnlen); for (i = asnlen; i-- != 0; p++) { - ND_PRINT((ndo, (i == asnlen-1) ? "%u" : ".%u", *p)); + ND_PRINT((ndo, (i == asnlen-1) ? "%u" : ".%u", EXTRACT_U_1(p))); } break; @@ -922,9 +922,9 @@ smi_decode_oid(netdissect_options *ndo, unsigned int firstval; for (*oidlen = 0; i-- > 0; p++) { - ND_TCHECK(*p); - o = (o << ASN_SHIFT7) + (*p & ~ASN_BIT8); - if (*p & ASN_LONGLEN) + ND_TCHECK_1(p); + o = (o << ASN_SHIFT7) + (EXTRACT_U_1(p) & ~ASN_BIT8); + if (EXTRACT_U_1(p) & ASN_LONGLEN) continue; /* @@ -1798,7 +1798,7 @@ v3msg_print(netdissect_options *ndo, ND_PRINT((ndo, "[msgFlags size %d]", elem.asnlen)); return; } - flags = elem.data.str[0]; + flags = EXTRACT_U_1(elem.data.str); if (flags != 0x00 && flags != 0x01 && flags != 0x03 && flags != 0x04 && flags != 0x05 && flags != 0x07) { ND_PRINT((ndo, "[msgFlags=0x%02X]", flags));