X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/17cd4f48f8aee24c988b662b95884d50b6395584..571b072e2fcb2cfeb3d253f4dff0f1c167238b7c:/src/addrfam.c diff --git a/src/addrfam.c b/src/addrfam.c index 528036c..0ba2049 100644 --- a/src/addrfam.c +++ b/src/addrfam.c @@ -4,7 +4,7 @@ */ /* * This file is part of adns, which is - * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson + * Copyright (C) 1997-2000,2003,2006,2014-2016 Ian Jackson * Copyright (C) 2014 Mark Wooding * Copyright (C) 1999-2000,2003,2006 Tony Finch * Copyright (C) 1991 Massachusetts Institute of Technology @@ -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;