X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b8c56aa09228ee6c59af9bd2565bc66b69ac7943..0f328b4aa16b0b47f05a85c440ce1d07719e3cac:/print-snmp.c diff --git a/print-snmp.c b/print-snmp.c index 1b096dcf..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)); @@ -540,10 +543,10 @@ asn1_parse(netdissect_options *ndo, ND_PRINT((ndo, "[asnlen=0]")); return -1; } - 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; } @@ -580,7 +583,7 @@ asn1_parse(netdissect_options *ndo, 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; } @@ -590,7 +593,7 @@ asn1_parse(netdissect_options *ndo, 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; } @@ -679,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: @@ -698,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, "\"")); @@ -709,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; } } @@ -767,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; /* @@ -822,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; @@ -919,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; /* @@ -1795,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));