* net.cc (gethostby_helper): Use correct signedness.
This commit is contained in:
parent
d8f253f952
commit
0a20e5a02b
|
@ -1,3 +1,7 @@
|
||||||
|
2009-05-20 Eric Blake <ebb9@byu.net>
|
||||||
|
|
||||||
|
* net.cc (gethostby_helper): Use correct signedness.
|
||||||
|
|
||||||
2009-05-18 Christopher Faylor <me+cygwin@cgf.cx>
|
2009-05-18 Christopher Faylor <me+cygwin@cgf.cx>
|
||||||
|
|
||||||
* mount.cc (mount_info::add_item): Avoid using any-old '/' as
|
* mount.cc (mount_info::add_item): Avoid using any-old '/' as
|
||||||
|
|
|
@ -49,7 +49,7 @@ details. */
|
||||||
#include "cygwin/in6.h"
|
#include "cygwin/in6.h"
|
||||||
#include "ifaddrs.h"
|
#include "ifaddrs.h"
|
||||||
#include "tls_pbuf.h"
|
#include "tls_pbuf.h"
|
||||||
#define _CYGWIN_IN_H
|
#define _CYGWIN_IN_H
|
||||||
#include <resolv.h>
|
#include <resolv.h>
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
|
@ -63,7 +63,7 @@ extern "C"
|
||||||
const char *cygwin_inet_ntop (int, const void *, char *, socklen_t);
|
const char *cygwin_inet_ntop (int, const void *, char *, socklen_t);
|
||||||
int dn_length1(const unsigned char *, const unsigned char *,
|
int dn_length1(const unsigned char *, const unsigned char *,
|
||||||
const unsigned char *);
|
const unsigned char *);
|
||||||
|
|
||||||
} /* End of "C" section */
|
} /* End of "C" section */
|
||||||
|
|
||||||
const struct in6_addr in6addr_any = {{IN6ADDR_ANY_INIT}};
|
const struct in6_addr in6addr_any = {{IN6ADDR_ANY_INIT}};
|
||||||
|
@ -882,7 +882,7 @@ cygwin_gethostbyaddr (const char *addr, int len, int type)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
memcpy4to6 (char *dst, const u_char *src)
|
memcpy4to6 (char *dst, const u_char *src)
|
||||||
{
|
{
|
||||||
const unsigned int h[] = {0, 0, htonl (0xFFFF)};
|
const unsigned int h[] = {0, 0, htonl (0xFFFF)};
|
||||||
|
@ -890,7 +890,7 @@ memcpy4to6 (char *dst, const u_char *src)
|
||||||
memcpy (dst + 12, src, NS_INADDRSZ);
|
memcpy (dst + 12, src, NS_INADDRSZ);
|
||||||
}
|
}
|
||||||
|
|
||||||
static hostent *
|
static hostent *
|
||||||
gethostby_helper (const char *name, const int af, const int type,
|
gethostby_helper (const char *name, const int af, const int type,
|
||||||
const int addrsize_in, const int addrsize_out)
|
const int addrsize_in, const int addrsize_out)
|
||||||
{
|
{
|
||||||
|
@ -916,7 +916,7 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
}
|
}
|
||||||
msg = ptr;
|
msg = ptr;
|
||||||
anlen = res_search (name, ns_c_in, type, msg, msgsize);
|
anlen = res_search (name, ns_c_in, type, msg, msgsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ancount >= maxcount)
|
if (ancount >= maxcount)
|
||||||
{
|
{
|
||||||
|
@ -929,22 +929,22 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
old_errno = errno;
|
old_errno = errno;
|
||||||
free (msg);
|
free (msg);
|
||||||
set_errno (old_errno);
|
set_errno (old_errno);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
u_char *eomsg = msg + anlen - 1;
|
u_char *eomsg = msg + anlen - 1;
|
||||||
|
|
||||||
|
|
||||||
/* We scan the answer records to determine the required memory size.
|
/* We scan the answer records to determine the required memory size.
|
||||||
They can be corrupted and we don't fully trust that the message
|
They can be corrupted and we don't fully trust that the message
|
||||||
follows the standard exactly. glibc applies some checks that
|
follows the standard exactly. glibc applies some checks that
|
||||||
we emulate.
|
we emulate.
|
||||||
The answers are copied in the hostent structure in a second scan.
|
The answers are copied in the hostent structure in a second scan.
|
||||||
To simplify the second scan we store information as follows:
|
To simplify the second scan we store information as follows:
|
||||||
- "class" is replaced by the compressed name size
|
- "class" is replaced by the compressed name size
|
||||||
- the first 16 bits of the "ttl" store the expanded name size + 1
|
- the first 16 bits of the "ttl" store the expanded name size + 1
|
||||||
- the last 16 bits of the "ttl" store the offset to the next valid record.
|
- the last 16 bits of the "ttl" store the offset to the next valid record.
|
||||||
Note that "type" is rewritten in host byte order. */
|
Note that "type" is rewritten in host byte order. */
|
||||||
|
|
||||||
class record {
|
class record {
|
||||||
public:
|
public:
|
||||||
unsigned type: 16; // type
|
unsigned type: 16; // type
|
||||||
|
@ -960,7 +960,8 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
|
|
||||||
record * anptr = NULL, * prevptr = NULL, * curptr;
|
record * anptr = NULL, * prevptr = NULL, * curptr;
|
||||||
int i, alias_count = 0, string_size = 0, address_count = 0;
|
int i, alias_count = 0, string_size = 0, address_count = 0;
|
||||||
int complen, namelen1 = 0, address_len = 0, antype, anclass, ansize;
|
int namelen1 = 0, address_len = 0, antype, anclass, ansize;
|
||||||
|
unsigned complen;
|
||||||
|
|
||||||
/* Get the count of answers */
|
/* Get the count of answers */
|
||||||
ancount = ntohs (((HEADER *) msg)->ancount);
|
ancount = ntohs (((HEADER *) msg)->ancount);
|
||||||
|
@ -968,10 +969,10 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
/* Skip the question, it was verified by res_send */
|
/* Skip the question, it was verified by res_send */
|
||||||
ptr = msg + sizeof (HEADER);
|
ptr = msg + sizeof (HEADER);
|
||||||
if ((complen = dn_skipname (ptr, eomsg)) < 0)
|
if ((complen = dn_skipname (ptr, eomsg)) < 0)
|
||||||
goto corrupted;
|
goto corrupted;
|
||||||
/* Point to the beginning of the answer section */
|
/* Point to the beginning of the answer section */
|
||||||
ptr += complen + NS_QFIXEDSZ;
|
ptr += complen + NS_QFIXEDSZ;
|
||||||
|
|
||||||
/* Scan the answer records to determine the sizes */
|
/* Scan the answer records to determine the sizes */
|
||||||
for (i = 0; i < ancount; i++, ptr = curptr->data + ansize)
|
for (i = 0; i < ancount; i++, ptr = curptr->data + ansize)
|
||||||
{
|
{
|
||||||
|
@ -990,7 +991,7 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
if ((namelen1 = dn_length1 (msg, eomsg, curptr-> name())) <= 0)
|
if ((namelen1 = dn_length1 (msg, eomsg, curptr-> name())) <= 0)
|
||||||
goto corrupted;
|
goto corrupted;
|
||||||
|
|
||||||
if (antype == ns_t_cname)
|
if (antype == ns_t_cname)
|
||||||
{
|
{
|
||||||
alias_count++;
|
alias_count++;
|
||||||
string_size += namelen1;
|
string_size += namelen1;
|
||||||
|
@ -1028,7 +1029,7 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
h_errno = NO_DATA;
|
h_errno = NO_DATA;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine the total size */
|
/* Determine the total size */
|
||||||
sz = DWORD_round (sizeof(hostent))
|
sz = DWORD_round (sizeof(hostent))
|
||||||
+ sizeof (char *) * (alias_count + address_count + 2)
|
+ sizeof (char *) * (alias_count + address_count + 2)
|
||||||
|
@ -1036,7 +1037,7 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
+ address_count * addrsize_out;
|
+ address_count * addrsize_out;
|
||||||
|
|
||||||
ret = realloc_ent (sz, (hostent *) NULL);
|
ret = realloc_ent (sz, (hostent *) NULL);
|
||||||
if (! ret)
|
if (! ret)
|
||||||
{
|
{
|
||||||
old_errno = errno;
|
old_errno = errno;
|
||||||
free (msg);
|
free (msg);
|
||||||
|
@ -1050,7 +1051,7 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
ret->h_aliases = (char **) (((char *) ret) + DWORD_round (sizeof(hostent)));
|
ret->h_aliases = (char **) (((char *) ret) + DWORD_round (sizeof(hostent)));
|
||||||
ret->h_addr_list = ret->h_aliases + alias_count + 1;
|
ret->h_addr_list = ret->h_aliases + alias_count + 1;
|
||||||
string_ptr = (char *) (ret->h_addr_list + address_count + 1);
|
string_ptr = (char *) (ret->h_addr_list + address_count + 1);
|
||||||
|
|
||||||
/* Rescan the answers */
|
/* Rescan the answers */
|
||||||
ancount = alias_count + address_count; /* Valid records */
|
ancount = alias_count + address_count; /* Valid records */
|
||||||
alias_count = address_count = 0;
|
alias_count = address_count = 0;
|
||||||
|
@ -1058,17 +1059,17 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
for (i = 0, curptr = anptr; i < ancount; i++, curptr = curptr->next ())
|
for (i = 0, curptr = anptr; i < ancount; i++, curptr = curptr->next ())
|
||||||
{
|
{
|
||||||
antype = curptr->type;
|
antype = curptr->type;
|
||||||
if (antype == ns_t_cname)
|
if (antype == ns_t_cname)
|
||||||
{
|
{
|
||||||
complen = dn_expand (msg, eomsg, curptr->name (), string_ptr, string_size);
|
complen = dn_expand (msg, eomsg, curptr->name (), string_ptr, string_size);
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
if (complen != curptr->complen)
|
if (complen != curptr->complen)
|
||||||
goto debugging;
|
goto debugging;
|
||||||
#endif
|
#endif
|
||||||
ret->h_aliases[alias_count++] = string_ptr;
|
ret->h_aliases[alias_count++] = string_ptr;
|
||||||
namelen1 = curptr->namelen1;
|
namelen1 = curptr->namelen1;
|
||||||
string_ptr += namelen1;
|
string_ptr += namelen1;
|
||||||
string_size -= namelen1;
|
string_size -= namelen1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (antype == type)
|
if (antype == type)
|
||||||
|
@ -1077,13 +1078,13 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
{
|
{
|
||||||
complen = dn_expand (msg, eomsg, curptr->name(), string_ptr, string_size);
|
complen = dn_expand (msg, eomsg, curptr->name(), string_ptr, string_size);
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
if (complen != curptr->complen)
|
if (complen != curptr->complen)
|
||||||
goto debugging;
|
goto debugging;
|
||||||
#endif
|
#endif
|
||||||
ret->h_name = string_ptr;
|
ret->h_name = string_ptr;
|
||||||
namelen1 = curptr->namelen1;
|
namelen1 = curptr->namelen1;
|
||||||
string_ptr += namelen1;
|
string_ptr += namelen1;
|
||||||
string_size -= namelen1;
|
string_size -= namelen1;
|
||||||
}
|
}
|
||||||
ret->h_addr_list[address_count++] = string_ptr;
|
ret->h_addr_list[address_count++] = string_ptr;
|
||||||
if (addrsize_in != addrsize_out)
|
if (addrsize_in != addrsize_out)
|
||||||
|
@ -1100,15 +1101,15 @@ gethostby_helper (const char *name, const int af, const int type,
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef DEBUGGING
|
#ifdef DEBUGGING
|
||||||
if (string_size < 0)
|
if (string_size < 0)
|
||||||
goto debugging;
|
goto debugging;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
free (msg);
|
free (msg);
|
||||||
|
|
||||||
ret->h_aliases[alias_count] = NULL;
|
ret->h_aliases[alias_count] = NULL;
|
||||||
ret->h_addr_list[address_count] = NULL;
|
ret->h_addr_list[address_count] = NULL;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
corrupted:
|
corrupted:
|
||||||
|
@ -1143,7 +1144,7 @@ gethostbyname2 (const char *name, int af)
|
||||||
bool v4to6 = _res.options & RES_USE_INET6;
|
bool v4to6 = _res.options & RES_USE_INET6;
|
||||||
|
|
||||||
int type, addrsize_in, addrsize_out;
|
int type, addrsize_in, addrsize_out;
|
||||||
switch (af)
|
switch (af)
|
||||||
{
|
{
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
addrsize_in = NS_INADDRSZ;
|
addrsize_in = NS_INADDRSZ;
|
||||||
|
@ -1159,7 +1160,7 @@ gethostbyname2 (const char *name, int af)
|
||||||
h_errno = NETDB_INTERNAL;
|
h_errno = NETDB_INTERNAL;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return gethostby_helper (name, af, type, addrsize_in, addrsize_out);
|
return gethostby_helper (name, af, type, addrsize_in, addrsize_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1445,20 +1446,20 @@ struct sockaddr_in6_old {
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef union sockaddr_gen{
|
typedef union sockaddr_gen{
|
||||||
struct sockaddr Address;
|
struct sockaddr Address;
|
||||||
struct sockaddr_in AddressIn;
|
struct sockaddr_in AddressIn;
|
||||||
struct sockaddr_in6_old AddressIn6;
|
struct sockaddr_in6_old AddressIn6;
|
||||||
} sockaddr_gen;
|
} sockaddr_gen;
|
||||||
|
|
||||||
typedef struct _INTERFACE_INFO {
|
typedef struct _INTERFACE_INFO {
|
||||||
u_long iiFlags;
|
u_long iiFlags;
|
||||||
sockaddr_gen iiAddress;
|
sockaddr_gen iiAddress;
|
||||||
sockaddr_gen iiBroadcastAddress;
|
sockaddr_gen iiBroadcastAddress;
|
||||||
sockaddr_gen iiNetmask;
|
sockaddr_gen iiNetmask;
|
||||||
} INTERFACE_INFO, *LPINTERFACE_INFO;
|
} INTERFACE_INFO, *LPINTERFACE_INFO;
|
||||||
|
|
||||||
#ifndef IN_LOOPBACK
|
#ifndef IN_LOOPBACK
|
||||||
#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000)
|
#define IN_LOOPBACK(a) ((((long int) (a)) & 0xff000000) == 0x7f000000)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int in6_are_prefix_equal (struct in6_addr *, struct in6_addr *, int);
|
static int in6_are_prefix_equal (struct in6_addr *, struct in6_addr *, int);
|
||||||
|
@ -2360,7 +2361,7 @@ if_indextoname (unsigned ifindex, char *ifname)
|
||||||
We identify the loopback device by its IfIndex of 1. */
|
We identify the loopback device by its IfIndex of 1. */
|
||||||
if (pap->IfIndex == 1 && pap->Ipv6IfIndex == 0)
|
if (pap->IfIndex == 1 && pap->Ipv6IfIndex == 0)
|
||||||
for (PIP_ADAPTER_ADDRESSES pap2 = pa0; pap2; pap2 = pap2->Next)
|
for (PIP_ADAPTER_ADDRESSES pap2 = pa0; pap2; pap2 = pap2->Next)
|
||||||
if (pap2->Ipv6IfIndex == 1)
|
if (pap2->Ipv6IfIndex == 1)
|
||||||
{
|
{
|
||||||
pap = pap2;
|
pap = pap2;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue