mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
- Phil Blundell added the internal function ares__expand_name_for_response()
that is now used by the ares_parse_*_reply() functions instead of the ares_expand_name() simply to easier return ARES_EBADRESP for the cases where the name expansion fails as in responses that really isn't expected.
This commit is contained in:
parent
f7e3bd28b4
commit
32b75d1b69
@ -1,5 +1,13 @@
|
|||||||
Changelog for the c-ares project
|
Changelog for the c-ares project
|
||||||
|
|
||||||
|
* January 11 2008 (Daniel Stenberg)
|
||||||
|
- Phil Blundell added the internal function ares__expand_name_for_response()
|
||||||
|
that is now used by the ares_parse_*_reply() functions instead of the
|
||||||
|
ares_expand_name() simply to easier return ARES_EBADRESP for the cases where
|
||||||
|
the name expansion fails as in responses that really isn't expected.
|
||||||
|
|
||||||
|
Version 1.6.0 (Dec 9, 2008)
|
||||||
|
|
||||||
* December 9 2008 (Gisle Vanem)
|
* December 9 2008 (Gisle Vanem)
|
||||||
|
|
||||||
Fixes for Win32 targets using the Watt-32 tcp/ip stack.
|
Fixes for Win32 targets using the Watt-32 tcp/ip stack.
|
||||||
|
@ -6,10 +6,11 @@ Changed:
|
|||||||
|
|
||||||
Fixed:
|
Fixed:
|
||||||
|
|
||||||
o
|
o ares_parse_*_reply() functions now return ARES_EBADRESP instead of
|
||||||
|
ARES_EBADNAME if the name in the response failed to decode
|
||||||
|
|
||||||
Thanks go to these friendly people for their efforts and contributions:
|
Thanks go to these friendly people for their efforts and contributions:
|
||||||
|
|
||||||
|
Phil Blundell
|
||||||
|
|
||||||
Have fun!
|
Have fun!
|
||||||
|
@ -177,3 +177,14 @@ static int name_length(const unsigned char *encoded, const unsigned char *abuf,
|
|||||||
*/
|
*/
|
||||||
return (n) ? n - 1 : n;
|
return (n) ? n - 1 : n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Like ares_expand_name but returns EBADRESP in case of invalid input. */
|
||||||
|
int ares__expand_name_for_response(const unsigned char *encoded,
|
||||||
|
const unsigned char *abuf, int alen,
|
||||||
|
char **s, long *enclen)
|
||||||
|
{
|
||||||
|
int status = ares_expand_name(encoded, abuf, alen, s, enclen);
|
||||||
|
if (status == ARES_EBADNAME)
|
||||||
|
status = ARES_EBADRESP;
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
@ -83,7 +83,7 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
|
|
||||||
/* Expand the name from the question, and skip past the question. */
|
/* Expand the name from the question, and skip past the question. */
|
||||||
aptr = abuf + HFIXEDSZ;
|
aptr = abuf + HFIXEDSZ;
|
||||||
status = ares_expand_name(aptr, abuf, alen, &hostname, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &hostname, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
if (aptr + len + QFIXEDSZ > abuf + alen)
|
if (aptr + len + QFIXEDSZ > abuf + alen)
|
||||||
@ -95,7 +95,8 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
|
|
||||||
if (host)
|
if (host)
|
||||||
{
|
{
|
||||||
/* Allocate addresses and aliases; ancount gives an upper bound for both. */
|
/* Allocate addresses and aliases; ancount gives an upper bound for
|
||||||
|
both. */
|
||||||
addrs = malloc(ancount * sizeof(struct in_addr));
|
addrs = malloc(ancount * sizeof(struct in_addr));
|
||||||
if (!addrs)
|
if (!addrs)
|
||||||
{
|
{
|
||||||
@ -115,7 +116,7 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
addrs = NULL;
|
addrs = NULL;
|
||||||
aliases = NULL;
|
aliases = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
naddrs = 0;
|
naddrs = 0;
|
||||||
naliases = 0;
|
naliases = 0;
|
||||||
|
|
||||||
@ -123,7 +124,7 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
for (i = 0; i < (int)ancount; i++)
|
for (i = 0; i < (int)ancount; i++)
|
||||||
{
|
{
|
||||||
/* Decode the RR up to the data field. */
|
/* Decode the RR up to the data field. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
aptr += len;
|
aptr += len;
|
||||||
@ -176,7 +177,8 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
|||||||
naliases++;
|
naliases++;
|
||||||
|
|
||||||
/* Decode the RR data and replace the hostname with it. */
|
/* Decode the RR data and replace the hostname with it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
|
||||||
|
&len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
free(hostname);
|
free(hostname);
|
||||||
|
@ -84,7 +84,7 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
|||||||
|
|
||||||
/* Expand the name from the question, and skip past the question. */
|
/* Expand the name from the question, and skip past the question. */
|
||||||
aptr = abuf + HFIXEDSZ;
|
aptr = abuf + HFIXEDSZ;
|
||||||
status = ares_expand_name(aptr, abuf, alen, &hostname, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &hostname, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
if (aptr + len + QFIXEDSZ > abuf + alen)
|
if (aptr + len + QFIXEDSZ > abuf + alen)
|
||||||
@ -123,7 +123,7 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
|||||||
for (i = 0; i < (int)ancount; i++)
|
for (i = 0; i < (int)ancount; i++)
|
||||||
{
|
{
|
||||||
/* Decode the RR up to the data field. */
|
/* Decode the RR up to the data field. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
aptr += len;
|
aptr += len;
|
||||||
@ -176,7 +176,8 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
|||||||
naliases++;
|
naliases++;
|
||||||
|
|
||||||
/* Decode the RR data and replace the hostname with it. */
|
/* Decode the RR data and replace the hostname with it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
|
||||||
|
&len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
free(hostname);
|
free(hostname);
|
||||||
|
@ -73,7 +73,7 @@ int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
|||||||
|
|
||||||
/* Expand the name from the question, and skip past the question. */
|
/* Expand the name from the question, and skip past the question. */
|
||||||
aptr = abuf + HFIXEDSZ;
|
aptr = abuf + HFIXEDSZ;
|
||||||
status = ares_expand_name( aptr, abuf, alen, &hostname, &len );
|
status = ares__expand_name_for_response( aptr, abuf, alen, &hostname, &len);
|
||||||
if ( status != ARES_SUCCESS )
|
if ( status != ARES_SUCCESS )
|
||||||
return status;
|
return status;
|
||||||
if ( aptr + len + QFIXEDSZ > abuf + alen )
|
if ( aptr + len + QFIXEDSZ > abuf + alen )
|
||||||
@ -96,7 +96,7 @@ int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
|||||||
for ( i = 0; i < ( int ) ancount; i++ )
|
for ( i = 0; i < ( int ) ancount; i++ )
|
||||||
{
|
{
|
||||||
/* Decode the RR up to the data field. */
|
/* Decode the RR up to the data field. */
|
||||||
status = ares_expand_name( aptr, abuf, alen, &rr_name, &len );
|
status = ares__expand_name_for_response( aptr, abuf, alen, &rr_name, &len );
|
||||||
if ( status != ARES_SUCCESS )
|
if ( status != ARES_SUCCESS )
|
||||||
break;
|
break;
|
||||||
aptr += len;
|
aptr += len;
|
||||||
@ -113,7 +113,8 @@ int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
|||||||
if ( rr_class == C_IN && rr_type == T_NS )
|
if ( rr_class == C_IN && rr_type == T_NS )
|
||||||
{
|
{
|
||||||
/* Decode the RR data and add it to the nameservers list */
|
/* Decode the RR data and add it to the nameservers list */
|
||||||
status = ares_expand_name( aptr, abuf, alen, &rr_data, &len );
|
status = ares__expand_name_for_response( aptr, abuf, alen, &rr_data,
|
||||||
|
&len);
|
||||||
if ( status != ARES_SUCCESS )
|
if ( status != ARES_SUCCESS )
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
|
@ -73,7 +73,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
|||||||
|
|
||||||
/* Expand the name from the question, and skip past the question. */
|
/* Expand the name from the question, and skip past the question. */
|
||||||
aptr = abuf + HFIXEDSZ;
|
aptr = abuf + HFIXEDSZ;
|
||||||
status = ares_expand_name(aptr, abuf, alen, &ptrname, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &ptrname, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
return status;
|
return status;
|
||||||
if (aptr + len + QFIXEDSZ > abuf + alen)
|
if (aptr + len + QFIXEDSZ > abuf + alen)
|
||||||
@ -94,7 +94,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
|||||||
for (i = 0; i < (int)ancount; i++)
|
for (i = 0; i < (int)ancount; i++)
|
||||||
{
|
{
|
||||||
/* Decode the RR up to the data field. */
|
/* Decode the RR up to the data field. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_name, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_name, &len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
aptr += len;
|
aptr += len;
|
||||||
@ -112,7 +112,8 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
|||||||
&& strcasecmp(rr_name, ptrname) == 0)
|
&& strcasecmp(rr_name, ptrname) == 0)
|
||||||
{
|
{
|
||||||
/* Decode the RR data and set hostname to it. */
|
/* Decode the RR data and set hostname to it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
|
||||||
|
&len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
if (hostname)
|
if (hostname)
|
||||||
@ -141,7 +142,8 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
|||||||
if (rr_class == C_IN && rr_type == T_CNAME)
|
if (rr_class == C_IN && rr_type == T_CNAME)
|
||||||
{
|
{
|
||||||
/* Decode the RR data and replace ptrname with it. */
|
/* Decode the RR data and replace ptrname with it. */
|
||||||
status = ares_expand_name(aptr, abuf, alen, &rr_data, &len);
|
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
|
||||||
|
&len);
|
||||||
if (status != ARES_SUCCESS)
|
if (status != ARES_SUCCESS)
|
||||||
break;
|
break;
|
||||||
free(ptrname);
|
free(ptrname);
|
||||||
|
@ -319,6 +319,9 @@ int ares__read_line(FILE *fp, char **buf, int *bufsize);
|
|||||||
void ares__free_query(struct query *query);
|
void ares__free_query(struct query *query);
|
||||||
unsigned short ares__generate_new_id(rc4_key* key);
|
unsigned short ares__generate_new_id(rc4_key* key);
|
||||||
struct timeval ares__tvnow(void);
|
struct timeval ares__tvnow(void);
|
||||||
|
int ares__expand_name_for_response(const unsigned char *encoded,
|
||||||
|
const unsigned char *abuf, int alen,
|
||||||
|
char **s, long *enclen);
|
||||||
#if 0 /* Not used */
|
#if 0 /* Not used */
|
||||||
long ares__tvdiff(struct timeval t1, struct timeval t2);
|
long ares__tvdiff(struct timeval t1, struct timeval t2);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user