mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 23:00:07 +00:00
* include/arpa/nameser.h: Add optimizations for NS_GET16 and NS_GET32.
* resolv/res_send.c (res_nameinquery): Use NS_GET16 directly instead of ns_get16. (res_queriesmatch): Likewise. Minor optimization.
This commit is contained in:
parent
acf82eaf27
commit
697e162863
@ -1,5 +1,11 @@
|
||||
2006-05-06 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* include/arpa/nameser.h: Add optimizations for NS_GET16 and NS_GET32.
|
||||
|
||||
* resolv/res_send.c (res_nameinquery): Use NS_GET16 directly
|
||||
instead of ns_get16.
|
||||
(res_queriesmatch): Likewise. Minor optimization.
|
||||
|
||||
[BZ #2499]
|
||||
* resolv/res_query.c (__libc_res_nquery): If answerp != NULL,
|
||||
__libc_res_nsend might reallocate the buffer for the answer. In
|
||||
|
@ -1 +1,28 @@
|
||||
#include <resolv/arpa/nameser.h>
|
||||
|
||||
/* If the machine allows unaligned access we can do better than using
|
||||
the NS_GET16, NS_GET32, NS_PUT16, and NS_PUT32 macros from the
|
||||
installed header. */
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#if _STRING_ARCH_unaligned
|
||||
|
||||
# undef NS_GET16
|
||||
# define NS_GET16(s, cp) \
|
||||
do { \
|
||||
uint16_t *t_cp = (uint16_t *) (cp); \
|
||||
(s) = ntohs (*t_cp); \
|
||||
(cp) += NS_INT16SZ; \
|
||||
} while (0)
|
||||
|
||||
# undef NS_GET32
|
||||
# define NS_GET32(s, cp) \
|
||||
do { \
|
||||
uint32_t *t_cp = (uint32_t *) (cp); \
|
||||
(s) = ntohl (*t_cp); \
|
||||
(cp) += NS_INT32SZ; \
|
||||
} while (0)
|
||||
|
||||
#endif
|
||||
|
@ -267,8 +267,8 @@ res_nameinquery(const char *name, int type, int class,
|
||||
cp += n;
|
||||
if (cp + 2 * INT16SZ > eom)
|
||||
return (-1);
|
||||
ttype = ns_get16(cp); cp += INT16SZ;
|
||||
tclass = ns_get16(cp); cp += INT16SZ;
|
||||
NS_GET16(ttype, cp);
|
||||
NS_GET16(tclass, cp);
|
||||
if (ttype == type && tclass == class &&
|
||||
ns_samename(tname, name) == 1)
|
||||
return (1);
|
||||
@ -292,9 +292,6 @@ int
|
||||
res_queriesmatch(const u_char *buf1, const u_char *eom1,
|
||||
const u_char *buf2, const u_char *eom2)
|
||||
{
|
||||
const u_char *cp = buf1 + HFIXEDSZ;
|
||||
int qdcount = ntohs(((HEADER*)buf1)->qdcount);
|
||||
|
||||
if (buf1 + HFIXEDSZ > eom1 || buf2 + HFIXEDSZ > eom2)
|
||||
return (-1);
|
||||
|
||||
@ -306,8 +303,16 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
|
||||
(((HEADER *)buf2)->opcode == ns_o_update))
|
||||
return (1);
|
||||
|
||||
if (qdcount != ntohs(((HEADER*)buf2)->qdcount))
|
||||
/* Note that we initially do not convert QDCOUNT to the host byte
|
||||
order. We can compare it with the second buffers QDCOUNT
|
||||
value without doing this. */
|
||||
int qdcount = ((HEADER*)buf1)->qdcount;
|
||||
if (qdcount != ((HEADER*)buf2)->qdcount)
|
||||
return (0);
|
||||
|
||||
qdcount = htons (qdcount);
|
||||
const u_char *cp = buf1 + HFIXEDSZ;
|
||||
|
||||
while (qdcount-- > 0) {
|
||||
char tname[MAXDNAME+1];
|
||||
int n, ttype, tclass;
|
||||
@ -318,8 +323,8 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
|
||||
cp += n;
|
||||
if (cp + 2 * INT16SZ > eom1)
|
||||
return (-1);
|
||||
ttype = ns_get16(cp); cp += INT16SZ;
|
||||
tclass = ns_get16(cp); cp += INT16SZ;
|
||||
NS_GET16(ttype, cp);
|
||||
NS_GET16(tclass, cp);
|
||||
if (!res_nameinquery(tname, ttype, tclass, buf2, eom2))
|
||||
return (0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user