|
@@ -1582,12 +1582,12 @@ int attribute_hidden __dns_lookup(const char *name,
|
|
|
|
|
|
parser_t * __open_etc_hosts(void)
|
|
|
{
|
|
|
- parser_t * parser;
|
|
|
- if ((parser = config_open("/etc/hosts")) == NULL) {
|
|
|
+ parser_t *parser;
|
|
|
+ parser = config_open("/etc/hosts");
|
|
|
#ifdef FALLBACK_TO_CONFIG_RESOLVCONF
|
|
|
+ if (parser == NULL)
|
|
|
parser = config_open("/etc/config/hosts");
|
|
|
#endif
|
|
|
- }
|
|
|
return parser;
|
|
|
}
|
|
|
|
|
@@ -2739,8 +2739,6 @@ libc_hidden_def(ns_name_uncompress)
|
|
|
*/
|
|
|
int ns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
|
|
|
{
|
|
|
- static const char digits[] = "0123456789";
|
|
|
-
|
|
|
const u_char *cp;
|
|
|
char *dn, *eom;
|
|
|
u_char c;
|
|
@@ -2782,9 +2780,10 @@ int ns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
|
|
|
return -1;
|
|
|
}
|
|
|
*dn++ = '\\';
|
|
|
- *dn++ = digits[c / 100];
|
|
|
- *dn++ = digits[(c % 100) / 10];
|
|
|
- *dn++ = digits[c % 10];
|
|
|
+ *dn++ = "0123456789"[c / 100];
|
|
|
+ c = c % 100;
|
|
|
+ *dn++ = "0123456789"[c / 10];
|
|
|
+ *dn++ = "0123456789"[c % 10];
|
|
|
} else {
|
|
|
if (dn >= eom) {
|
|
|
__set_errno(EMSGSIZE);
|
|
@@ -2810,27 +2809,6 @@ int ns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
|
|
|
}
|
|
|
libc_hidden_def(ns_name_ntop)
|
|
|
|
|
|
-static const char digits[] = "0123456789";
|
|
|
-
|
|
|
-static const char digitvalue[256] = {
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
|
-};
|
|
|
-
|
|
|
static int encode_bitstring(const char **bp, const char *end,
|
|
|
unsigned char **labelp,
|
|
|
unsigned char ** dst,
|
|
@@ -2839,32 +2817,33 @@ static int encode_bitstring(const char **bp, const char *end,
|
|
|
int afterslash = 0;
|
|
|
const char *cp = *bp;
|
|
|
unsigned char *tp;
|
|
|
- char c;
|
|
|
const char *beg_blen;
|
|
|
- char *end_blen = NULL;
|
|
|
int value = 0, count = 0, tbcount = 0, blen = 0;
|
|
|
|
|
|
- beg_blen = end_blen = NULL;
|
|
|
+ beg_blen = NULL;
|
|
|
|
|
|
|
|
|
if (end - cp < 2)
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
|
|
|
|
|
|
if (*cp++ != 'x')
|
|
|
- return (EINVAL);
|
|
|
- if (!isxdigit((*cp) & 0xff))
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
+ if (!isxdigit((unsigned char) *cp))
|
|
|
+ return EINVAL;
|
|
|
|
|
|
for (tp = *dst + 1; cp < end && tp < eom; cp++) {
|
|
|
- switch((c = *cp)) {
|
|
|
+ unsigned char c = *cp;
|
|
|
+
|
|
|
+ switch (c) {
|
|
|
case ']':
|
|
|
if (afterslash) {
|
|
|
+ char *end_blen;
|
|
|
if (beg_blen == NULL)
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
blen = (int)strtol(beg_blen, &end_blen, 10);
|
|
|
if (*end_blen != ']')
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
}
|
|
|
if (count)
|
|
|
*tp++ = ((value << 4) & 0xff);
|
|
@@ -2875,25 +2854,29 @@ static int encode_bitstring(const char **bp, const char *end,
|
|
|
break;
|
|
|
default:
|
|
|
if (afterslash) {
|
|
|
- if (!isdigit(c&0xff))
|
|
|
- return (EINVAL);
|
|
|
+ if (!__isdigit_char(c))
|
|
|
+ return EINVAL;
|
|
|
if (beg_blen == NULL) {
|
|
|
-
|
|
|
if (c == '0') {
|
|
|
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
}
|
|
|
beg_blen = cp;
|
|
|
}
|
|
|
} else {
|
|
|
- if (!isxdigit(c&0xff))
|
|
|
- return (EINVAL);
|
|
|
+ if (!__isdigit_char(c)) {
|
|
|
+ c = c | 0x20;
|
|
|
+ c = c - 'a';
|
|
|
+ if (c > 5)
|
|
|
+ return EINVAL;
|
|
|
+ c += 10 + '0';
|
|
|
+ }
|
|
|
value <<= 4;
|
|
|
- value += digitvalue[(int)c];
|
|
|
+ value += (c - '0');
|
|
|
count += 4;
|
|
|
tbcount += 4;
|
|
|
if (tbcount > 256)
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
if (count == 8) {
|
|
|
*tp++ = value;
|
|
|
count = 0;
|
|
@@ -2904,7 +2887,7 @@ static int encode_bitstring(const char **bp, const char *end,
|
|
|
}
|
|
|
done:
|
|
|
if (cp >= end || tp >= eom)
|
|
|
- return (EMSGSIZE);
|
|
|
+ return EMSGSIZE;
|
|
|
|
|
|
|
|
|
* bit length validation:
|
|
@@ -2918,10 +2901,10 @@ static int encode_bitstring(const char **bp, const char *end,
|
|
|
int traillen;
|
|
|
|
|
|
if (((blen + 3) & ~3) != tbcount)
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
traillen = tbcount - blen;
|
|
|
if (((value << (8 - traillen)) & 0xff) != 0)
|
|
|
- return (EINVAL);
|
|
|
+ return EINVAL;
|
|
|
}
|
|
|
else
|
|
|
blen = tbcount;
|
|
@@ -2935,11 +2918,12 @@ static int encode_bitstring(const char **bp, const char *end,
|
|
|
*bp = cp;
|
|
|
*dst = tp;
|
|
|
|
|
|
- return (0);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
int ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
|
|
|
{
|
|
|
+ static const char digits[] = "0123456789";
|
|
|
u_char *label, *bp, *eom;
|
|
|
int c, n, escaped, e = 0;
|
|
|
char *cp;
|
|
@@ -2952,44 +2936,47 @@ int ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
|
|
|
while ((c = *src++) != 0) {
|
|
|
if (escaped) {
|
|
|
if (c == '[') {
|
|
|
- if ((cp = strchr(src, ']')) == NULL) {
|
|
|
+ cp = strchr(src, ']');
|
|
|
+ if (cp == NULL) {
|
|
|
errno = EINVAL;
|
|
|
- return (-1);
|
|
|
+ return -1;
|
|
|
}
|
|
|
- if ((e = encode_bitstring(&src, cp + 2,
|
|
|
- &label, &bp, eom))
|
|
|
- != 0) {
|
|
|
+ e = encode_bitstring(&src, cp + 2,
|
|
|
+ &label, &bp, eom);
|
|
|
+ if (e != 0) {
|
|
|
errno = e;
|
|
|
- return (-1);
|
|
|
+ return -1;
|
|
|
}
|
|
|
escaped = 0;
|
|
|
label = bp++;
|
|
|
- if ((c = *src++) == 0)
|
|
|
+ c = *src++;
|
|
|
+ if (c == '\0')
|
|
|
goto done;
|
|
|
- else if (c != '.') {
|
|
|
+ if (c != '.') {
|
|
|
errno = EINVAL;
|
|
|
- return (-1);
|
|
|
+ return -1;
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
- else if ((cp = strchr(digits, c)) != NULL) {
|
|
|
+ cp = strchr(digits, c);
|
|
|
+ if (cp != NULL) {
|
|
|
n = (cp - digits) * 100;
|
|
|
- if ((c = *src++) == 0 ||
|
|
|
- (cp = strchr(digits, c)) == NULL) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
- }
|
|
|
+ c = *src++;
|
|
|
+ if (c == '\0')
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
+ cp = strchr(digits, c);
|
|
|
+ if (cp == NULL)
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
n += (cp - digits) * 10;
|
|
|
- if ((c = *src++) == 0 ||
|
|
|
- (cp = strchr(digits, c)) == NULL) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
- }
|
|
|
+ c = *src++;
|
|
|
+ if (c == '\0')
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
+ cp = strchr(digits, c);
|
|
|
+ if (cp == NULL)
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
n += (cp - digits);
|
|
|
- if (n > 255) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
- }
|
|
|
+ if (n > 255)
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
c = n;
|
|
|
}
|
|
|
escaped = 0;
|
|
@@ -2999,67 +2986,61 @@ int ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
|
|
|
} else if (c == '.') {
|
|
|
c = (bp - label - 1);
|
|
|
if ((c & NS_CMPRSFLGS) != 0) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
if (label >= eom) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
*label = c;
|
|
|
|
|
|
if (*src == '\0') {
|
|
|
if (c != 0) {
|
|
|
if (bp >= eom) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
*bp++ = '\0';
|
|
|
}
|
|
|
if ((bp - dst) > MAXCDNAME) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
|
|
|
- return (1);
|
|
|
+ return 1;
|
|
|
}
|
|
|
if (c == 0 || *src == '.') {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
label = bp++;
|
|
|
continue;
|
|
|
}
|
|
|
if (bp >= eom) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
*bp++ = (u_char)c;
|
|
|
}
|
|
|
c = (bp - label - 1);
|
|
|
if ((c & NS_CMPRSFLGS) != 0) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
- done:
|
|
|
+ done:
|
|
|
if (label >= eom) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
*label = c;
|
|
|
if (c != 0) {
|
|
|
if (bp >= eom) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
*bp++ = 0;
|
|
|
}
|
|
|
if ((bp - dst) > MAXCDNAME) {
|
|
|
- errno = EMSGSIZE;
|
|
|
- return (-1);
|
|
|
+ goto ret_EMSGSIZE;
|
|
|
}
|
|
|
|
|
|
- return (0);
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ ret_EMSGSIZE:
|
|
|
+ errno = EMSGSIZE;
|
|
|
+ return -1;
|
|
|
}
|
|
|
libc_hidden_def(ns_name_pton)
|
|
|
|
|
@@ -3140,7 +3121,7 @@ libc_hidden_def(ns_name_unpack)
|
|
|
|
|
|
static int labellen(const unsigned char *lp)
|
|
|
{
|
|
|
- int bitlen;
|
|
|
+ unsigned bitlen;
|
|
|
unsigned char l = *lp;
|
|
|
|
|
|
if ((l & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
|
@@ -3150,7 +3131,8 @@ static int labellen(const unsigned char *lp)
|
|
|
|
|
|
if ((l & NS_CMPRSFLGS) == NS_TYPE_ELT) {
|
|
|
if (l == DNS_LABELTYPE_BITSTRING) {
|
|
|
- if ((bitlen = *(lp + 1)) == 0)
|
|
|
+ bitlen = lp[1];
|
|
|
+ if (bitlen == 0)
|
|
|
bitlen = 256;
|
|
|
return ((bitlen + 7 ) / 8 + 1);
|
|
|
}
|
|
@@ -3166,7 +3148,7 @@ static int mklower(int ch)
|
|
|
if (ch >= 0x41 && ch <= 0x5A)
|
|
|
return (ch + 0x20);
|
|
|
|
|
|
- return (ch);
|
|
|
+ return ch;
|
|
|
}
|
|
|
|
|
|
static int dn_find(const unsigned char *domain,
|
|
@@ -3245,7 +3227,8 @@ int ns_name_pack(const unsigned char *src,
|
|
|
lpp = cpp = NULL;
|
|
|
|
|
|
if (dnptrs != NULL) {
|
|
|
- if ((msg = *dnptrs++) != NULL) {
|
|
|
+ msg = *dnptrs++;
|
|
|
+ if (msg != NULL) {
|
|
|
for (cpp = dnptrs; *cpp != NULL; cpp++)
|
|
|
continue;
|
|
|
|
|
@@ -3266,7 +3249,8 @@ int ns_name_pack(const unsigned char *src,
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- if ((l0 = labellen(srcp)) < 0) {
|
|
|
+ l0 = labellen(srcp);
|
|
|
+ if (l0 < 0) {
|
|
|
errno = EINVAL;
|
|
|
return -1;
|
|
|
}
|
|
@@ -3365,7 +3349,8 @@ int ns_name_skip(const unsigned char **ptrptr,
|
|
|
cp += n;
|
|
|
continue;
|
|
|
case NS_TYPE_ELT:
|
|
|
- if ((l = labellen(cp - 1)) < 0) {
|
|
|
+ l = labellen(cp - 1);
|
|
|
+ if (l < 0) {
|
|
|
errno = EMSGSIZE;
|
|
|
return -1;
|
|
|
}
|
|
@@ -3546,7 +3531,7 @@ __res_vinit(res_state rp, int preinit)
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-__res_iclose(res_state statp, int free_addr)
|
|
|
+__res_iclose(void)
|
|
|
{
|
|
|
__UCLIBC_MUTEX_LOCK(__resolv_lock);
|
|
|
__close_nameservers();
|
|
@@ -3578,15 +3563,15 @@ __res_iclose(res_state statp, int free_addr)
|
|
|
void
|
|
|
res_nclose(res_state statp)
|
|
|
{
|
|
|
- __res_iclose(statp, 1);
|
|
|
+ __res_iclose();
|
|
|
}
|
|
|
|
|
|
#ifdef __UCLIBC_HAS_BSD_RES_CLOSE__
|
|
|
void res_close(void)
|
|
|
{
|
|
|
- __res_iclose(&_res, 0);
|
|
|
+ __res_iclose();
|
|
|
}
|
|
|
-#endif
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
#undef _res
|
|
@@ -3618,7 +3603,8 @@ struct __res_state *__resp = &_res;
|
|
|
#endif
|
|
|
|
|
|
static unsigned int
|
|
|
-res_randomid(void) {
|
|
|
+res_randomid(void)
|
|
|
+{
|
|
|
return 0xffff & getpid();
|
|
|
}
|
|
|
|
|
@@ -3649,18 +3635,18 @@ res_init(void)
|
|
|
__UCLIBC_MUTEX_LOCK(__resolv_lock);
|
|
|
|
|
|
if (!_res.retrans)
|
|
|
- _res.retrans = RES_TIMEOUT;
|
|
|
+ _res.retrans = RES_TIMEOUT;
|
|
|
if (!_res.retry)
|
|
|
- _res.retry = 4;
|
|
|
+ _res.retry = 4;
|
|
|
if (!(_res.options & RES_INIT))
|
|
|
- _res.options = RES_DEFAULT;
|
|
|
+ _res.options = RES_DEFAULT;
|
|
|
|
|
|
|
|
|
* This one used to initialize implicitly to zero, so unless the app
|
|
|
* has set it to something in particular, we can randomize it now.
|
|
|
*/
|
|
|
if (!_res.id)
|
|
|
- _res.id = res_randomid();
|
|
|
+ _res.id = res_randomid();
|
|
|
__res_sync = res_sync_func;
|
|
|
|
|
|
__UCLIBC_MUTEX_UNLOCK(__resolv_lock);
|
|
@@ -4003,7 +3989,8 @@ void ns_put32(unsigned long src, unsigned char *dst)
|
|
|
|
|
|
#ifdef L_ns_parse
|
|
|
|
|
|
-const struct _ns_flagdata _ns_flagdata[16] = {
|
|
|
+struct _ns_flagdata { unsigned short mask, shift; };
|
|
|
+static const struct _ns_flagdata _ns_flagdata[16] = {
|
|
|
{ 0x8000, 15 },
|
|
|
{ 0x7800, 11 },
|
|
|
{ 0x0400, 10 },
|
|
@@ -4150,7 +4137,7 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr)
|
|
|
rrnum - handle->_rrnum);
|
|
|
|
|
|
if (b < 0)
|
|
|
- return (-1);
|
|
|
+ return -1;
|
|
|
handle->_ptr += b;
|
|
|
handle->_rrnum = rrnum;
|
|
|
}
|
|
@@ -4159,7 +4146,7 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr)
|
|
|
b = dn_expand(handle->_msg, handle->_eom,
|
|
|
handle->_ptr, rr->name, NS_MAXDNAME);
|
|
|
if (b < 0)
|
|
|
- return (-1);
|
|
|
+ return -1;
|
|
|
handle->_ptr += b;
|
|
|
if (handle->_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom) {
|
|
|
errno = EMSGSIZE;
|
|
@@ -4191,7 +4178,8 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int ns_msg_getflag(ns_msg handle, int flag) {
|
|
|
+int ns_msg_getflag(ns_msg handle, int flag)
|
|
|
+{
|
|
|
return ((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift;
|
|
|
}
|
|
|
#endif
|
|
@@ -4251,7 +4239,8 @@ int res_mkquery(int op, const char *dname, int class, int type,
|
|
|
if (ep - cp < QFIXEDSZ)
|
|
|
return -1;
|
|
|
|
|
|
- if ((n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs, lastdnptr)) < 0)
|
|
|
+ n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs, lastdnptr);
|
|
|
+ if (n < 0)
|
|
|
return -1;
|
|
|
|
|
|
cp += n;
|