From b4e502bf093a31a5ea94596f0d5db2160893ec6f Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 2 Jun 2014 01:01:14 +0100 Subject: [PATCH] ipv4 quadonly, make test program compile --- client/addrtext.c | 4 ++-- src/addrfam.c | 13 ++++++++----- src/adns.h | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/client/addrtext.c b/client/addrtext.c index 136de26..f61aa68 100644 --- a/client/addrtext.c +++ b/client/addrtext.c @@ -109,7 +109,7 @@ static void dotest(const char *input) { memset(&ours,0,sizeof(ours)); socklen= sizeof(ours); - int our_r= adns_text2addr(input,PORT,&ours.sa,&socklen); + int our_r= adns_text2addr(input,PORT,0,&ours.sa,&socklen); memset(&aip,0,sizeof(aip)); aip.ai_flags= AI_NUMERICHOST|AI_NUMERICSERV; @@ -160,7 +160,7 @@ static void dotest(const char *input) { int ourbuflen= sizeof(ourbuf); int ourport; - our_r= adns_addr2text(&ours.sa, ourbuf,&ourbuflen, &ourport); + our_r= adns_addr2text(&ours.sa,0, ourbuf,&ourbuflen, &ourport); printf(" us %s",strerror(our_r)); if (!our_r) diff --git a/src/addrfam.c b/src/addrfam.c index 13f2a03..99e2fab 100644 --- a/src/addrfam.c +++ b/src/addrfam.c @@ -296,11 +296,14 @@ int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags, sa->sa_family= af; *portp = htons(port); - int r= inet_pton(af,parse,dst); - if (!r) INVAL("inet_pton rejected"); - if (r<0) { - af_debug("inet_pton failed on `%s'", parse); - return errno; + if (af == AF_INET && !(flags & adns_qf_addrlit_ipv4_quadonly)) { + /* we have to use inet_aton to deal with non-dotted-quad literals */ + int r= inet_aton(parse,&SIN(sa)->sin_addr); + if (!r) INVAL("inet_aton rejected"); + } else { + int r= inet_pton(af,parse,dst); + if (!r) INVAL("inet_pton rejected"); + assert(r>0); } if (scopestr) { diff --git a/src/adns.h b/src/adns.h index 07bc04e..012df15 100644 --- a/src/adns.h +++ b/src/adns.h @@ -138,6 +138,7 @@ typedef enum { /* In general, or together the desired flags: */ adns__qf_afmask= 0x00001c00,/* all the above flag bits */ adns_qf_addrlit_scope_forbid=0x00002000,/* forbid % in IPv6 literals */ adns_qf_addrlit_scope_numeric=0x00004000,/* % may only be numeric */ + adns_qf_addrlit_ipv4_quadonly=0x00008000,/* reject non-dotted-quad ipv4 */ adns__qf_internalmask= 0x0ff00000 } adns_queryflags; -- 2.30.2