X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0dad1934af3db3f97d4371463089c8725dbfa26d..d8bf24c8743edcd257e2e76b1ed15a2b49208051:/addrtoname.c diff --git a/addrtoname.c b/addrtoname.c index f488dde0..1c80c39f 100644 --- a/addrtoname.c +++ b/addrtoname.c @@ -125,7 +125,7 @@ /* * hash tables for whatever-to-name translations * - * ndo_error() called on strdup(3) failure + * ndo_error() called on strdup(3) failure with S_ERR_ND_MEM_ALLOC status */ #define HASHNAMESIZE 4096 @@ -242,13 +242,13 @@ intoa(uint32_t addr) n = 4; do { byte = addr & 0xff; - *--cp = byte % 10 + '0'; + *--cp = (char)(byte % 10) + '0'; byte /= 10; if (byte > 0) { - *--cp = byte % 10 + '0'; + *--cp = (char)(byte % 10) + '0'; byte /= 10; if (byte > 0) - *--cp = byte + '0'; + *--cp = (char)byte + '0'; } *--cp = '.'; addr >>= 8; @@ -269,7 +269,7 @@ extern cap_channel_t *capdns; * * NOTE: ap is *NOT* necessarily part of the packet data (not even if * this is being called with the "ipaddr_string()" macro), so you - * *CANNOT* use the ND_TCHECK{2}/ND_TTEST{2} macros on it. Furthermore, + * *CANNOT* use the ND_TCHECK_* or ND_TTEST_* macros on it. Furthermore, * even in cases where it *is* part of the packet data, the caller * would still have to check for a null return value, even if it's * just printing the return value with "%s" - not all versions of @@ -319,8 +319,8 @@ ipaddr_string(netdissect_options *ndo, const u_char *ap) p->name = strdup(hp->h_name); if (p->name == NULL) - (*ndo->ndo_error)(ndo, - "ipaddr_string: strdup(hp->h_name)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "ipaddr_string: strdup(hp->h_name)"); if (ndo->ndo_Nflag) { /* Remove domain qualifications */ dotp = strchr(p->name, '.'); @@ -332,7 +332,8 @@ ipaddr_string(netdissect_options *ndo, const u_char *ap) } p->name = strdup(intoa(addr)); if (p->name == NULL) - (*ndo->ndo_error)(ndo, "ipaddr_string: strdup(intoa(addr))"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "ipaddr_string: strdup(intoa(addr))"); return (p->name); } @@ -381,8 +382,8 @@ ip6addr_string(netdissect_options *ndo, const u_char *ap) p->name = strdup(hp->h_name); if (p->name == NULL) - (*ndo->ndo_error)(ndo, - "ip6addr_string: strdup(hp->h_name)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "ip6addr_string: strdup(hp->h_name)"); if (ndo->ndo_Nflag) { /* Remove domain qualifications */ dotp = strchr(p->name, '.'); @@ -395,7 +396,8 @@ ip6addr_string(netdissect_options *ndo, const u_char *ap) cp = addrtostr6(ap, ntop_buf, sizeof(ntop_buf)); p->name = strdup(cp); if (p->name == NULL) - (*ndo->ndo_error)(ndo, "ip6addr_string: strdup(cp)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "ip6addr_string: strdup(cp)"); return (p->name); } @@ -424,12 +426,12 @@ lookup_emem(netdissect_options *ndo, const u_char *ep) return tp; else tp = tp->e_nxt; - tp->e_addr0 = i; - tp->e_addr1 = j; - tp->e_addr2 = k; + tp->e_addr0 = (u_short)i; + tp->e_addr1 = (u_short)j; + tp->e_addr2 = (u_short)k; tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); if (tp->e_nxt == NULL) - (*ndo->ndo_error)(ndo, "lookup_emem: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_emem: calloc"); return tp; } @@ -468,19 +470,21 @@ lookup_bytestring(netdissect_options *ndo, const u_char *bs, else tp = tp->bs_nxt; - tp->bs_addr0 = i; - tp->bs_addr1 = j; - tp->bs_addr2 = k; + tp->bs_addr0 = (u_short)i; + tp->bs_addr1 = (u_short)j; + tp->bs_addr2 = (u_short)k; tp->bs_bytes = (u_char *) calloc(1, nlen); if (tp->bs_bytes == NULL) - (*ndo->ndo_error)(ndo, "lookup_bytestring: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "lookup_bytestring: calloc"); memcpy(tp->bs_bytes, bs, nlen); tp->bs_nbytes = nlen; tp->bs_nxt = (struct bsnamemem *)calloc(1, sizeof(*tp)); if (tp->bs_nxt == NULL) - (*ndo->ndo_error)(ndo, "lookup_bytestring: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "lookup_bytestring: calloc"); return tp; } @@ -515,17 +519,17 @@ lookup_nsap(netdissect_options *ndo, const u_char *nsap, return tp; else tp = tp->e_nxt; - tp->e_addr0 = i; - tp->e_addr1 = j; - tp->e_addr2 = k; + tp->e_addr0 = (u_short)i; + tp->e_addr1 = (u_short)j; + tp->e_addr2 = (u_short)k; tp->e_nsap = (u_char *)malloc(nsap_length + 1); if (tp->e_nsap == NULL) - (*ndo->ndo_error)(ndo, "lookup_nsap: malloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_nsap: malloc"); tp->e_nsap[0] = (u_char)nsap_length; /* guaranteed < ISONSAP_MAX_LENGTH */ memcpy((char *)&tp->e_nsap[1], (const char *)nsap, nsap_length); tp->e_nxt = (struct enamemem *)calloc(1, sizeof(*tp)); if (tp->e_nxt == NULL) - (*ndo->ndo_error)(ndo, "lookup_nsap: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_nsap: calloc"); return tp; } @@ -550,16 +554,16 @@ lookup_protoid(netdissect_options *ndo, const u_char *pi) else tp = tp->p_nxt; tp->p_oui = i; - tp->p_proto = j; + tp->p_proto = (u_short)j; tp->p_nxt = (struct protoidmem *)calloc(1, sizeof(*tp)); if (tp->p_nxt == NULL) - (*ndo->ndo_error)(ndo, "lookup_protoid: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, "lookup_protoid: calloc"); return tp; } const char * -etheraddr_string(netdissect_options *ndo, const u_char *ep) +etheraddr_string(netdissect_options *ndo, const uint8_t *ep) { int i; char *cp; @@ -577,8 +581,8 @@ etheraddr_string(netdissect_options *ndo, const u_char *ep) if (ether_ntohost(buf2, (const struct ether_addr *)ep) == 0) { tp->e_name = strdup(buf2); if (tp->e_name == NULL) - (*ndo->ndo_error)(ndo, - "etheraddr_string: strdup(buf2)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "etheraddr_string: strdup(buf2)"); return (tp->e_name); } } @@ -600,12 +604,13 @@ etheraddr_string(netdissect_options *ndo, const u_char *ep) *cp = '\0'; tp->e_name = strdup(buf); if (tp->e_name == NULL) - (*ndo->ndo_error)(ndo, "etheraddr_string: strdup(buf)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "etheraddr_string: strdup(buf)"); return (tp->e_name); } const char * -le64addr_string(netdissect_options *ndo, const u_char *ep) +le64addr_string(netdissect_options *ndo, const uint8_t *ep) { const unsigned int len = 8; u_int i; @@ -629,13 +634,14 @@ le64addr_string(netdissect_options *ndo, const u_char *ep) tp->bs_name = strdup(buf); if (tp->bs_name == NULL) - (*ndo->ndo_error)(ndo, "le64addr_string: strdup(buf)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "le64addr_string: strdup(buf)"); return (tp->bs_name); } const char * -linkaddr_string(netdissect_options *ndo, const u_char *ep, +linkaddr_string(netdissect_options *ndo, const uint8_t *ep, const unsigned int type, const unsigned int len) { u_int i; @@ -657,7 +663,8 @@ linkaddr_string(netdissect_options *ndo, const u_char *ep, tp->bs_name = cp = (char *)malloc(len*3); if (tp->bs_name == NULL) - (*ndo->ndo_error)(ndo, "linkaddr_string: malloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "linkaddr_string: malloc"); *cp++ = hex[*ep >> 4]; *cp++ = hex[*ep++ & 0xf]; for (i = len-1; i > 0 ; --i) { @@ -669,37 +676,9 @@ linkaddr_string(netdissect_options *ndo, const u_char *ep, return (tp->bs_name); } -const char * -etherproto_string(netdissect_options *ndo, u_short port) -{ - char *cp; - struct hnamemem *tp; - uint32_t i = port; - char buf[sizeof("0000")]; - - for (tp = &eprototable[i & (HASHNAMESIZE-1)]; tp->nxt; tp = tp->nxt) - if (tp->addr == i) - return (tp->name); - - tp->addr = i; - tp->nxt = newhnamemem(ndo); - - cp = buf; - NTOHS(port); - *cp++ = hex[port >> 12 & 0xf]; - *cp++ = hex[port >> 8 & 0xf]; - *cp++ = hex[port >> 4 & 0xf]; - *cp++ = hex[port & 0xf]; - *cp++ = '\0'; - tp->name = strdup(buf); - if (tp->name == NULL) - (*ndo->ndo_error)(ndo, "etherproto_string: strdup(buf)"); - return (tp->name); -} - #define ISONSAP_MAX_LENGTH 20 const char * -isonsap_string(netdissect_options *ndo, const u_char *nsap, +isonsap_string(netdissect_options *ndo, const uint8_t *nsap, u_int nsap_length) { u_int nsap_idx; @@ -715,14 +694,15 @@ isonsap_string(netdissect_options *ndo, const u_char *nsap, tp->e_name = cp = (char *)malloc(sizeof("xx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xxxx.xx")); if (cp == NULL) - (*ndo->ndo_error)(ndo, "isonsap_string: malloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "isonsap_string: malloc"); for (nsap_idx = 0; nsap_idx < nsap_length; nsap_idx++) { *cp++ = hex[*nsap >> 4]; *cp++ = hex[*nsap++ & 0xf]; if (((nsap_idx & 1) == 0) && (nsap_idx + 1 < nsap_length)) { - *cp++ = '.'; + *cp++ = '.'; } } *cp = '\0'; @@ -746,7 +726,8 @@ tcpport_string(netdissect_options *ndo, u_short port) (void)nd_snprintf(buf, sizeof(buf), "%u", i); tp->name = strdup(buf); if (tp->name == NULL) - (*ndo->ndo_error)(ndo, "tcpport_string: strdup(buf)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "tcpport_string: strdup(buf)"); return (tp->name); } @@ -767,7 +748,8 @@ udpport_string(netdissect_options *ndo, u_short port) (void)nd_snprintf(buf, sizeof(buf), "%u", i); tp->name = strdup(buf); if (tp->name == NULL) - (*ndo->ndo_error)(ndo, "udpport_string: strdup(buf)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "udpport_string: strdup(buf)"); return (tp->name); } @@ -795,7 +777,8 @@ ipxsap_string(netdissect_options *ndo, u_short port) *cp++ = '\0'; tp->name = strdup(buf); if (tp->name == NULL) - (*ndo->ndo_error)(ndo, "ipxsap_string: strdup(buf)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "ipxsap_string: strdup(buf)"); return (tp->name); } @@ -825,7 +808,8 @@ init_servarray(netdissect_options *ndo) } else table->name = strdup(sv->s_name); if (table->name == NULL) - (*ndo->ndo_error)(ndo, "init_servarray: strdup"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "init_servarray: strdup"); table->addr = port; table->nxt = newhnamemem(ndo); @@ -911,8 +895,8 @@ init_protoidarray(netdissect_options *ndo) tp = lookup_protoid(ndo, protoid); tp->p_name = strdup(eproto_db[i].s); if (tp->p_name == NULL) - (*ndo->ndo_error)(ndo, - "init_protoidarray: strdup(eproto_db[i].s)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "init_protoidarray: strdup(eproto_db[i].s)"); } /* Hardwire some SNAP proto ID names */ for (pl = protoidlist; pl->name != NULL; ++pl) { @@ -965,8 +949,8 @@ init_etherarray(netdissect_options *ndo) tp = lookup_emem(ndo, ep->addr); tp->e_name = strdup(ep->name); if (tp->e_name == NULL) - (*ndo->ndo_error)(ndo, - "init_etherarray: strdup(ep->addr)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "init_etherarray: strdup(ep->addr)"); } (void)fclose(fp); } @@ -986,8 +970,8 @@ init_etherarray(netdissect_options *ndo) if (ether_ntohost(name, (const struct ether_addr *)el->addr) == 0) { tp->e_name = strdup(name); if (tp->e_name == NULL) - (*ndo->ndo_error)(ndo, - "init_etherarray: strdup(name)"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "init_etherarray: strdup(name)"); continue; } #endif @@ -995,7 +979,10 @@ init_etherarray(netdissect_options *ndo) } } -static const struct tok ipxsap_db[] = { +static const struct ipxsap_ent { + uint16_t v; + const char *s; +} ipxsap_db[] = { { 0x0000, "Unknown" }, { 0x0001, "User" }, { 0x0002, "User Group" }, @@ -1219,7 +1206,7 @@ init_ipxsaparray(netdissect_options *ndo) struct hnamemem *table; for (i = 0; ipxsap_db[i].s != NULL; i++) { - int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1); + u_int j = htons(ipxsap_db[i].v) & (HASHNAMESIZE-1); table = &ipxsaptable[j]; while (table->name) table = table->nxt; @@ -1287,7 +1274,8 @@ newhnamemem(netdissect_options *ndo) num = 64; ptr = (struct hnamemem *)calloc(num, sizeof (*ptr)); if (ptr == NULL) - (*ndo->ndo_error)(ndo, "newhnamemem: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "newhnamemem: calloc"); } --num; p = ptr++; @@ -1306,7 +1294,8 @@ newh6namemem(netdissect_options *ndo) num = 64; ptr = (struct h6namemem *)calloc(num, sizeof (*ptr)); if (ptr == NULL) - (*ndo->ndo_error)(ndo, "newh6namemem: calloc"); + (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC, + "newh6namemem: calloc"); } --num; p = ptr++;