X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fidnlookup.c;h=4866c810abeede8a25379f7bd4036cf980bc76aa;hb=5bd036b52f6cfa5dfbfe43f487fcc61821dd6ed6;hp=1727c4dedc20c26e0b00114961bdbb22d434f49d;hpb=25415ec8842de4109b23467aa1cd63e06bf19fbe;p=icmp-dn.git diff --git a/src/idnlookup.c b/src/idnlookup.c index 1727c4d..4866c81 100644 --- a/src/idnlookup.c +++ b/src/idnlookup.c @@ -35,32 +35,7 @@ #include "config.h" #endif -struct icmphdr { - u_int8_t type; - u_int8_t code; - u_int16_t checksum; -}; - -struct reqhdr { - u_int8_t type; - u_int8_t code; - u_int16_t checksum; - u_int16_t id; - u_int16_t seq; -}; - -struct rephdr { - u_int8_t type; - u_int8_t code; - u_int16_t checksum; - u_int16_t id; - u_int16_t seq; - int32_t ttl; - -}; - -#define ICMP_NAMEREQ 37 -#define ICMP_NAMEREP 38 +#include "icmpdefs.h" unsigned char buf[65536]; @@ -78,6 +53,10 @@ void printdn(FILE *f, unsigned char *dnbuf, size_t size, int onlyfirst) fprintf(stderr, "domain name decompression not implemented, aborting\n"); exit(1); } + if((int)*p + (p - dnbuf) >= size) { + fprintf(stderr, "malformed domain name\n"); + return; + } fprintf(f, "%.*s", (int)*p, p + 1); p += 1 + (int)*p; if(*p != 0) @@ -178,7 +157,10 @@ int main(int argc, char **argv) memset(&aihint, 0, sizeof(aihint)); aihint.ai_socktype = SOCK_RAW; aihint.ai_protocol = IPPROTO_ICMP; - ret = getaddrinfo(argv[optind], NULL, &aihint, &ai); + if((ret = getaddrinfo(argv[optind], NULL, &aihint, &ai)) != 0) { + fprintf(stderr, "%s: %s\n", argv[optind], gai_strerror(ret)); + exit(1); + } for(cai = ai; cai != NULL; cai = cai->ai_next) { if((s = socket(cai->ai_family, SOCK_RAW, IPPROTO_ICMP)) < 0) { @@ -279,6 +261,6 @@ int main(int argc, char **argv) /* * Local Variables: - * compile-command: "gcc -Wall -g -o idnlookup idnlookup.c" + * compile-command: "make CFLAGS='-Wall -g'" * End: */