diff options
-rw-r--r-- | regress/case-unknown-flags-harmless.err | 0 | ||||
-rw-r--r-- | regress/case-unknown-flags-harmless.out | 5 | ||||
-rw-r--r-- | regress/case-unknown-flags-harmless.sys | 34 | ||||
-rw-r--r-- | regress/case-unknown-flags-init.err | 1 | ||||
-rw-r--r-- | regress/case-unknown-flags-init.out | 1 | ||||
-rw-r--r-- | regress/case-unknown-flags-init.sys | 2 | ||||
-rw-r--r-- | regress/case-unknown-flags-query.err | 0 | ||||
-rw-r--r-- | regress/case-unknown-flags-query.out | 3 | ||||
-rw-r--r-- | regress/case-unknown-flags-query.sys | 15 | ||||
-rw-r--r-- | regress/case-unknown-flags-type.err | 0 | ||||
-rw-r--r-- | regress/case-unknown-flags-type.out | 3 | ||||
-rw-r--r-- | regress/case-unknown-flags-type.sys | 15 | ||||
-rw-r--r-- | src/addrfam.c | 17 | ||||
-rw-r--r-- | src/adns.h | 5 | ||||
-rw-r--r-- | src/query.c | 6 | ||||
-rw-r--r-- | src/setup.c | 4 | ||||
-rw-r--r-- | src/types.c | 4 |
17 files changed, 111 insertions, 4 deletions
diff --git a/regress/case-unknown-flags-harmless.err b/regress/case-unknown-flags-harmless.err new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/regress/case-unknown-flags-harmless.err diff --git a/regress/case-unknown-flags-harmless.out b/regress/case-unknown-flags-harmless.out new file mode 100644 index 0000000..08a05a8 --- /dev/null +++ b/regress/case-unknown-flags-harmless.out @@ -0,0 +1,5 @@ +adns debug: using nameserver 172.18.45.6 +chiark.greenend.org.uk flags 1074266112 type 1 A(-) submitted +chiark.greenend.org.uk flags 1074266112 type A(-): OK; nrrs=1; cname=$; owner=$; ttl=3600 + 212.13.197.229 +rc=0 diff --git a/regress/case-unknown-flags-harmless.sys b/regress/case-unknown-flags-harmless.sys new file mode 100644 index 0000000..e06fc00 --- /dev/null +++ b/regress/case-unknown-flags-harmless.sys @@ -0,0 +1,34 @@ +./adnstest default -0x4000 +:0x60000000|1 0x40080000/chiark.greenend.org.uk + start 1414182720.022422 + socket domain=AF_INET type=SOCK_DGRAM + socket=6 + +0.000183 + fcntl fd=6 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000097 + fcntl fd=6 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000076 + sendto fd=6 addr=172.18.45.6:53 + 311f0100 00010000 00000000 06636869 61726b08 67726565 6e656e64 036f7267 + 02756b00 00010001. + sendto=40 + +0.000272 + select max=7 rfds=[6] wfds=[] efds=[] to=1.999728 + select=1 rfds=[6] wfds=[] efds=[] + +0.102141 + recvfrom fd=6 buflen=512 + recvfrom=OK addr=172.18.45.6:53 + 311f8580 00010001 00020002 06636869 61726b08 67726565 6e656e64 036f7267 + 02756b00 00010001 c00c0001 00010000 0e100004 d40dc5e5 c0130002 00010001 + 51800011 036e7331 0a72656c 61746976 697479c0 13c01300 02000100 01518000 + 06036e73 30c048c0 61000100 01000151 800004ac 122d06c0 44000100 01000151 + 800004ac 122d0b. + +0.000252 + recvfrom fd=6 buflen=512 + recvfrom=EAGAIN + +0.000070 + close fd=6 + close=OK + +0.000138 diff --git a/regress/case-unknown-flags-init.err b/regress/case-unknown-flags-init.err new file mode 100644 index 0000000..8d1d1d8 --- /dev/null +++ b/regress/case-unknown-flags-init.err @@ -0,0 +1 @@ +adns failure: init: errno=ENOSYS diff --git a/regress/case-unknown-flags-init.out b/regress/case-unknown-flags-init.out new file mode 100644 index 0000000..daa767e --- /dev/null +++ b/regress/case-unknown-flags-init.out @@ -0,0 +1 @@ +rc=2 diff --git a/regress/case-unknown-flags-init.sys b/regress/case-unknown-flags-init.sys new file mode 100644 index 0000000..e177c78 --- /dev/null +++ b/regress/case-unknown-flags-init.sys @@ -0,0 +1,2 @@ +./adnstest default -0x6000 +:0x60000000|1 0x40080000/chiark.greenend.org.uk diff --git a/regress/case-unknown-flags-query.err b/regress/case-unknown-flags-query.err new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/regress/case-unknown-flags-query.err diff --git a/regress/case-unknown-flags-query.out b/regress/case-unknown-flags-query.out new file mode 100644 index 0000000..ac8e541 --- /dev/null +++ b/regress/case-unknown-flags-query.out @@ -0,0 +1,3 @@ +adns debug: using nameserver 172.18.45.6 +chiark.greenend.org.uk flags 1075314688 type 1 not implemented +rc=0 diff --git a/regress/case-unknown-flags-query.sys b/regress/case-unknown-flags-query.sys new file mode 100644 index 0000000..ce849e8 --- /dev/null +++ b/regress/case-unknown-flags-query.sys @@ -0,0 +1,15 @@ +./adnstest default -0x4000 +:0x60000000|1 0x40180000/chiark.greenend.org.uk + start 1414182790.489799 + socket domain=AF_INET type=SOCK_DGRAM + socket=6 + +0.000123 + fcntl fd=6 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000047 + fcntl fd=6 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000039 + close fd=6 + close=OK + +0.000149 diff --git a/regress/case-unknown-flags-type.err b/regress/case-unknown-flags-type.err new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/regress/case-unknown-flags-type.err diff --git a/regress/case-unknown-flags-type.out b/regress/case-unknown-flags-type.out new file mode 100644 index 0000000..a12353a --- /dev/null +++ b/regress/case-unknown-flags-type.out @@ -0,0 +1,3 @@ +adns debug: using nameserver 172.18.45.6 +chiark.greenend.org.uk flags 1074266112 type 1 not implemented +rc=0 diff --git a/regress/case-unknown-flags-type.sys b/regress/case-unknown-flags-type.sys new file mode 100644 index 0000000..41705b8 --- /dev/null +++ b/regress/case-unknown-flags-type.sys @@ -0,0 +1,15 @@ +./adnstest default -0x4000 +:0x70000000|1 0x40080000/chiark.greenend.org.uk + start 1414182770.758670 + socket domain=AF_INET type=SOCK_DGRAM + socket=6 + +0.000142 + fcntl fd=6 cmd=F_GETFL + fcntl=~O_NONBLOCK&... + +0.000080 + fcntl fd=6 cmd=F_SETFL O_NONBLOCK|... + fcntl=OK + +0.000060 + close fd=6 + close=OK + +0.000170 diff --git a/src/addrfam.c b/src/addrfam.c index 528036c..5067048 100644 --- a/src/addrfam.c +++ b/src/addrfam.c @@ -256,9 +256,18 @@ static bool addrtext_scope_use_ifname(const struct sockaddr *sa) { IN6_IS_ADDR_MC_LINKLOCAL(in6); } +static int textaddr_check_qf(adns_queryflags flags) { + if (flags & ~(adns_queryflags)(adns_qf_addrlit_scope_forbid| + adns_qf_addrlit_scope_numeric| + adns_qf_addrlit_ipv4_quadonly| + 0x40000000)) + return ENOSYS; + return 0; +} + int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags, struct sockaddr *sa, socklen_t *salen_io) { - int af; + int r, af; char copybuf[INET6_ADDRSTRLEN]; const char *parse=text; const char *scopestr=0; @@ -266,6 +275,8 @@ int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags, void *dst; uint16_t *portp; + r= textaddr_check_qf(flags); if (r) return r; + #define INVAL(how) do{ \ af_debug("invalid: %s: `%s'", how, text); \ return EINVAL; \ @@ -389,7 +400,9 @@ int adns_text2addr(const char *text, uint16_t port, adns_queryflags flags, int adns_addr2text(const struct sockaddr *sa, adns_queryflags flags, char *buffer, int *buflen_io, int *port_r) { const void *src; - int port; + int r, port; + + r= textaddr_check_qf(flags); if (r) return r; if (*buflen_io < ADNS_ADDR2TEXT_BUFLEN) { *buflen_io = ADNS_ADDR2TEXT_BUFLEN; @@ -709,8 +709,7 @@ int adns_addr2text(const struct sockaddr *sa, adns_queryflags flags, * port is always in host byte order and is simply copied to and * from the appropriate sockaddr field (byteswapped as necessary). * - * The only flags supported are adns_qf_addrlit_...; others are - * ignored. + * The only flags supported are adns_qf_addrlit_... * * Error return values are: * @@ -733,6 +732,8 @@ int adns_addr2text(const struct sockaddr *sa, adns_queryflags flags, * * EAFNOSUPPORT sa->sa_family is not supported (addr2text only). * + * ENOSYS Unsupported flags set. + * * Only if neither adns_qf_addrlit_scope_forbid nor * adns_qf_addrlit_scope_numeric are set: * diff --git a/src/query.c b/src/query.c index 1f51b69..ff56fc3 100644 --- a/src/query.c +++ b/src/query.c @@ -275,6 +275,12 @@ int adns_submit(adns_state ads, adns__consistency(ads,0,cc_entex); + if (flags & ~(adns_queryflags)0x4009ffff) + /* 0x40080000 are reserved for `harmless' future expansion + * 0x00000020 used to be adns_qf_quoteok_cname, now the default; + * see also addrfam.c:textaddr_check_qf */ + return ENOSYS; + typei= adns__findtype(type); if (!typei) return ENOSYS; diff --git a/src/setup.c b/src/setup.c index 12d2241..fd20c43 100644 --- a/src/setup.c +++ b/src/setup.c @@ -567,6 +567,10 @@ static int init_begin(adns_state *ads_r, adns_initflags flags, adns_state ads; pid_t pid; + if (flags & ~(adns_initflags)(0x4fff)) + /* 0x4000 is reserved for `harmless' future expansion */ + return ENOSYS; + ads= malloc(sizeof(*ads)); if (!ads) return errno; ads->iflags= flags; diff --git a/src/types.c b/src/types.c index 06d0d4c..d65e155 100644 --- a/src/types.c +++ b/src/types.c @@ -1693,6 +1693,10 @@ DEEP_TYPE(unknown,0, "unknown",byteblock,opaque, 0, opaque ); const typeinfo *adns__findtype(adns_rrtype type) { const typeinfo *begin, *end, *mid; + if (type & ~(adns_rrtype)0x63ffffff) + /* 0x60000000 is reserved for `harmless' future expansion */ + return 0; + if (type & adns_r_unknown) return &typeinfo_unknown; type &= adns_rrt_reprmask; |