1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

Fix bug#1307.

This commit is contained in:
Werner Koch 2011-01-10 19:35:10 +01:00
parent 344d72b2f7
commit 18936a1970
6 changed files with 35 additions and 17 deletions

View file

@ -1,3 +1,9 @@
2011-01-10 Thomas Mraz <t8m@centrum.cz> (wk)
* pka.c (get_pka_info) [!USE_ADNS]: Turn ANSWER into a union to
avoid aliasing problems with modern compilers. See bug#1307.
Reported by Steve Grubb.
2011-01-10 Werner Koch <wk@g10code.com>
* session-env.c (update_var): Fix same value test. Fixes

View file

@ -173,7 +173,11 @@ get_pka_info (const char *address, unsigned char *fpr)
return buffer;
#else /*!USE_ADNS*/
unsigned char answer[PACKETSZ];
union
{
signed char p[PACKETSZ];
HEADER h;
} answer;
int anslen;
int qdcount, ancount, nscount, arcount;
int rc;
@ -192,11 +196,11 @@ get_pka_info (const char *address, unsigned char *fpr)
memcpy (name, address, domain - address);
strcpy (stpcpy (name + (domain-address), "._pka."), domain+1);
anslen = res_query (name, C_IN, T_TXT, answer, PACKETSZ);
anslen = res_query (name, C_IN, T_TXT, answer.p, PACKETSZ);
xfree (name);
if (anslen < sizeof(HEADER))
return NULL; /* DNS resolver returned a too short answer. */
if ( (rc=((HEADER*)answer)->rcode) != NOERROR )
if ( (rc=answer.h.rcode) != NOERROR )
return NULL; /* DNS resolver returned an error. */
/* We assume that PACKETSZ is large enough and don't do dynmically
@ -204,16 +208,16 @@ get_pka_info (const char *address, unsigned char *fpr)
if (anslen > PACKETSZ)
return NULL; /* DNS resolver returned a too long answer */
qdcount = ntohs (((HEADER*)answer)->qdcount);
ancount = ntohs (((HEADER*)answer)->ancount);
nscount = ntohs (((HEADER*)answer)->nscount);
arcount = ntohs (((HEADER*)answer)->arcount);
qdcount = ntohs (answer.h.qdcount);
ancount = ntohs (answer.h.ancount);
nscount = ntohs (answer.h.nscount);
arcount = ntohs (answer.h.arcount);
if (!ancount)
return NULL; /* Got no answer. */
p = answer + sizeof (HEADER);
pend = answer + anslen; /* Actually points directly behind the buffer. */
p = answer.p + sizeof (HEADER);
pend = answer.p + anslen; /* Actually points directly behind the buffer. */
while (qdcount-- && p < pend)
{