--- C:\ethernut-4.8.5.stock\nut\pro\resolv.c Fri Mar 27 18:13:46 2009 UTC +++ C:\ethernut-4.8.5\nut\pro\resolv.c Sun Nov 29 22:07:20 2009 UTC @@ -244,6 +244,8 @@ rc = strlen((char *)cp) + 1; np = *npp = malloc(rc); + if (np) + { len = *cp++; while (len) { while (len--) @@ -252,6 +254,7 @@ *np++ = '.'; } *np = 0; + } return rc; } @@ -261,7 +264,10 @@ if (*npp) free(*npp); *npp = malloc(len); + if (*npp) + { memcpy(*npp, cp, len); + } return len; } @@ -357,11 +363,10 @@ return rc; } -static DNSRESOURCE *CreateDnsResource(DNSRESOURCE * dor) +static DNSRESOURCE * CreateDnsResource(void) { - if (dor == NULL) - dor = calloc(1, sizeof(DNSRESOURCE)); - return dor; + DNSRESOURCE * r = (DNSRESOURCE *) calloc(1, sizeof(DNSRESOURCE)); + return r ; } static void ReleaseDnsResource(DNSRESOURCE * dor) @@ -480,12 +485,13 @@ UDPSOCKET *sock; DNSHEADER *doh = 0; DNSQUESTION *doq = 0; - DNSRESOURCE *dor = 0; int n; int retries; uint32_t raddr; uint16_t rport; + DNSRESOURCE *dor = NULL ; + /* * We need a configured DNS address. */ @@ -499,7 +505,10 @@ if ((sock = NutUdpCreateSocket(0)) == 0) return 0; pkt = malloc(512); - + if (!pkt) + { + return 0 ; + } for (retries = 0; retries < 6; retries++) { /* @@ -559,19 +568,24 @@ break; else { for (n = 1; n <= (int) doh->doh_answers; n++) { - dor = CreateDnsResource(dor); + dor = CreateDnsResource(); + if (!dor) + break ; len += DecodeDnsResource(dor, pkt + len); #ifdef NUTDEBUG //DumpDnsResource(dor); #endif if (dor->dor_type == 1) break; + ReleaseDnsResource(dor); + dor = NULL ; } - if (dor->dor_len == 4) { + if (dor && dor->dor_len == 4) { ip = *dor->dor_data; ip += (uint32_t)(*(dor->dor_data + 1)) << 8; ip += (uint32_t)(*(dor->dor_data + 2)) << 16; ip += (uint32_t)(*(dor->dor_data + 3)) << 24; + ReleaseDnsResource(dor); break; } /* TBD: 18.3.2004 - for MX requests authoritative rrs should be skipped + additional rrs should be searched for IP address */ @@ -584,7 +598,6 @@ */ ReleaseDnsHeader(doh); ReleaseDnsQuestion(doq); - ReleaseDnsResource(dor); free(pkt); NutUdpDestroySocket(sock);