mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-03 21:32:08 +00:00
DNS: Allow a DNS look-up with a trailing dot in the name
Signed-off-by: Simon Goldschmidt <goldsimon@gmx.de>
This commit is contained in:
parent
9071db11af
commit
ef76bbe3f0
@ -277,7 +277,7 @@ DNS_LOCAL_HOSTLIST_STORAGE_PRE struct local_hostlist_entry local_hostlist_static
|
|||||||
#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
||||||
|
|
||||||
static void dns_init_local(void);
|
static void dns_init_local(void);
|
||||||
static err_t dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype));
|
static err_t dns_lookup_local(const char *hostname, size_t hostnamelen, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype));
|
||||||
#endif /* DNS_LOCAL_HOSTLIST */
|
#endif /* DNS_LOCAL_HOSTLIST */
|
||||||
|
|
||||||
|
|
||||||
@ -476,18 +476,32 @@ dns_local_iterate(dns_found_callback iterator_fn, void *iterator_arg)
|
|||||||
err_t
|
err_t
|
||||||
dns_local_lookup(const char *hostname, ip_addr_t *addr, u8_t dns_addrtype)
|
dns_local_lookup(const char *hostname, ip_addr_t *addr, u8_t dns_addrtype)
|
||||||
{
|
{
|
||||||
|
size_t hostnamelen;
|
||||||
LWIP_UNUSED_ARG(dns_addrtype);
|
LWIP_UNUSED_ARG(dns_addrtype);
|
||||||
return dns_lookup_local(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype));
|
if ((addr == NULL) ||
|
||||||
|
(!hostname) || (!hostname[0])) {
|
||||||
|
return ERR_ARG;
|
||||||
|
}
|
||||||
|
hostnamelen = strlen(hostname);
|
||||||
|
if (hostname[hostnamelen - 1] == '.') {
|
||||||
|
hostnamelen--;
|
||||||
|
}
|
||||||
|
if (hostnamelen >= DNS_MAX_NAME_LENGTH) {
|
||||||
|
LWIP_DEBUGF(DNS_DEBUG, ("dns_local_lookup: name too long to resolve"));
|
||||||
|
return ERR_ARG;
|
||||||
|
}
|
||||||
|
return dns_lookup_local(hostname, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Internal implementation for dns_local_lookup and dns_lookup */
|
/* Internal implementation for dns_local_lookup and dns_lookup */
|
||||||
static err_t
|
static err_t
|
||||||
dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
|
dns_lookup_local(const char *hostname, size_t hostnamelen, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
|
||||||
{
|
{
|
||||||
#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC
|
||||||
struct local_hostlist_entry *entry = local_hostlist_dynamic;
|
struct local_hostlist_entry *entry = local_hostlist_dynamic;
|
||||||
while (entry != NULL) {
|
while (entry != NULL) {
|
||||||
if ((lwip_stricmp(entry->name, hostname) == 0) &&
|
if ((lwip_strnicmp(entry->name, hostname, hostnamelen) == 0) &&
|
||||||
|
!entry->name[hostnamelen] &&
|
||||||
LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, entry->addr)) {
|
LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, entry->addr)) {
|
||||||
if (addr) {
|
if (addr) {
|
||||||
ip_addr_copy(*addr, entry->addr);
|
ip_addr_copy(*addr, entry->addr);
|
||||||
@ -499,7 +513,8 @@ dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_
|
|||||||
#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < LWIP_ARRAYSIZE(local_hostlist_static); i++) {
|
for (i = 0; i < LWIP_ARRAYSIZE(local_hostlist_static); i++) {
|
||||||
if ((lwip_stricmp(local_hostlist_static[i].name, hostname) == 0) &&
|
if ((lwip_strnicmp(local_hostlist_static[i].name, hostname, hostnamelen) == 0) &&
|
||||||
|
!local_hostlist_static[i].name[hostnamelen] &&
|
||||||
LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, local_hostlist_static[i].addr)) {
|
LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, local_hostlist_static[i].addr)) {
|
||||||
if (addr) {
|
if (addr) {
|
||||||
ip_addr_copy(*addr, local_hostlist_static[i].addr);
|
ip_addr_copy(*addr, local_hostlist_static[i].addr);
|
||||||
@ -593,30 +608,34 @@ dns_local_addhost(const char *hostname, const ip_addr_t *addr)
|
|||||||
* for a hostname.
|
* for a hostname.
|
||||||
*
|
*
|
||||||
* @param name the hostname to look up
|
* @param name the hostname to look up
|
||||||
|
* @param hostnamelen length of the hostname
|
||||||
* @param addr the hostname's IP address, as u32_t (instead of ip_addr_t to
|
* @param addr the hostname's IP address, as u32_t (instead of ip_addr_t to
|
||||||
* better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname
|
* better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname
|
||||||
* was not found in the cached dns_table.
|
* was not found in the cached dns_table.
|
||||||
* @return ERR_OK if found, ERR_ARG if not found
|
* @return ERR_OK if found, ERR_ARG if not found
|
||||||
*/
|
*/
|
||||||
static err_t
|
static err_t
|
||||||
dns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
|
dns_lookup(const char *name, size_t hostnamelen, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))
|
||||||
{
|
{
|
||||||
|
size_t namelen;
|
||||||
u8_t i;
|
u8_t i;
|
||||||
#if DNS_LOCAL_HOSTLIST
|
#if DNS_LOCAL_HOSTLIST
|
||||||
if (dns_lookup_local(name, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
|
if (dns_lookup_local(name, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
#endif /* DNS_LOCAL_HOSTLIST */
|
#endif /* DNS_LOCAL_HOSTLIST */
|
||||||
#ifdef DNS_LOOKUP_LOCAL_EXTERN
|
#ifdef DNS_LOOKUP_LOCAL_EXTERN
|
||||||
if (DNS_LOOKUP_LOCAL_EXTERN(name, addr, LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(dns_addrtype)) == ERR_OK) {
|
if (DNS_LOOKUP_LOCAL_EXTERN(name, hostnamelen, addr, LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(dns_addrtype)) == ERR_OK) {
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
#endif /* DNS_LOOKUP_LOCAL_EXTERN */
|
#endif /* DNS_LOOKUP_LOCAL_EXTERN */
|
||||||
|
|
||||||
|
namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
|
||||||
/* Walk through name list, return entry if found. If not, return NULL. */
|
/* Walk through name list, return entry if found. If not, return NULL. */
|
||||||
for (i = 0; i < DNS_TABLE_SIZE; ++i) {
|
for (i = 0; i < DNS_TABLE_SIZE; ++i) {
|
||||||
if ((dns_table[i].state == DNS_STATE_DONE) &&
|
if ((dns_table[i].state == DNS_STATE_DONE) &&
|
||||||
(lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0) &&
|
(lwip_strnicmp(name, dns_table[i].name, namelen) == 0) &&
|
||||||
|
!dns_table[i].name[namelen] &&
|
||||||
LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, dns_table[i].ipaddr)) {
|
LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, dns_table[i].ipaddr)) {
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name));
|
LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name));
|
||||||
ip_addr_debug_print_val(DNS_DEBUG, dns_table[i].ipaddr);
|
ip_addr_debug_print_val(DNS_DEBUG, dns_table[i].ipaddr);
|
||||||
@ -1380,13 +1399,18 @@ dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found,
|
|||||||
struct dns_table_entry *entry = NULL;
|
struct dns_table_entry *entry = NULL;
|
||||||
size_t namelen;
|
size_t namelen;
|
||||||
struct dns_req_entry *req;
|
struct dns_req_entry *req;
|
||||||
|
|
||||||
#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
|
#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
|
||||||
u8_t r;
|
u8_t r;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
|
||||||
|
|
||||||
|
#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)
|
||||||
/* check for duplicate entries */
|
/* check for duplicate entries */
|
||||||
for (i = 0; i < DNS_TABLE_SIZE; i++) {
|
for (i = 0; i < DNS_TABLE_SIZE; i++) {
|
||||||
if ((dns_table[i].state == DNS_STATE_ASKING) &&
|
if ((dns_table[i].state == DNS_STATE_ASKING) &&
|
||||||
(lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0)) {
|
(lwip_strnicmp(name, dns_table[i].name, namelen) == 0) &&
|
||||||
|
!dns_table[i].name[namelen]) {
|
||||||
#if LWIP_IPV4 && LWIP_IPV6
|
#if LWIP_IPV4 && LWIP_IPV6
|
||||||
if (dns_table[i].reqaddrtype != dns_addrtype) {
|
if (dns_table[i].reqaddrtype != dns_addrtype) {
|
||||||
/* requested address types don't match
|
/* requested address types don't match
|
||||||
@ -1473,7 +1497,6 @@ dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found,
|
|||||||
LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype);
|
LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype);
|
||||||
req->found = found;
|
req->found = found;
|
||||||
req->arg = callback_arg;
|
req->arg = callback_arg;
|
||||||
namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH - 1);
|
|
||||||
MEMCPY(entry->name, name, namelen);
|
MEMCPY(entry->name, name, namelen);
|
||||||
entry->name[namelen] = 0;
|
entry->name[namelen] = 0;
|
||||||
|
|
||||||
@ -1563,6 +1586,9 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
hostnamelen = strlen(hostname);
|
hostnamelen = strlen(hostname);
|
||||||
|
if (hostname[hostnamelen - 1] == '.') {
|
||||||
|
hostnamelen--;
|
||||||
|
}
|
||||||
if (hostnamelen >= DNS_MAX_NAME_LENGTH) {
|
if (hostnamelen >= DNS_MAX_NAME_LENGTH) {
|
||||||
LWIP_DEBUGF(DNS_DEBUG, ("dns_gethostbyname: name too long to resolve"));
|
LWIP_DEBUGF(DNS_DEBUG, ("dns_gethostbyname: name too long to resolve"));
|
||||||
return ERR_ARG;
|
return ERR_ARG;
|
||||||
@ -1587,7 +1613,7 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* already have this address cached? */
|
/* already have this address cached? */
|
||||||
if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
|
if (dns_lookup(hostname, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
#if LWIP_IPV4 && LWIP_IPV6
|
#if LWIP_IPV4 && LWIP_IPV6
|
||||||
@ -1599,7 +1625,7 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call
|
|||||||
} else {
|
} else {
|
||||||
fallback = LWIP_DNS_ADDRTYPE_IPV4;
|
fallback = LWIP_DNS_ADDRTYPE_IPV4;
|
||||||
}
|
}
|
||||||
if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(fallback)) == ERR_OK) {
|
if (dns_lookup(hostname, hostnamelen, addr LWIP_DNS_ADDRTYPE_ARG(fallback)) == ERR_OK) {
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1178,7 +1178,9 @@
|
|||||||
* DNS_LOCAL_HOSTLIST_ELEM("host_ip6", IPADDR6_INIT_HOST(123, 234, 345, 456)}
|
* DNS_LOCAL_HOSTLIST_ELEM("host_ip6", IPADDR6_INIT_HOST(123, 234, 345, 456)}
|
||||||
*
|
*
|
||||||
* Instead, you can also use an external function:
|
* Instead, you can also use an external function:
|
||||||
* \#define DNS_LOOKUP_LOCAL_EXTERN(x) extern err_t my_lookup_function(const char *name, ip_addr_t *addr, u8_t dns_addrtype)
|
* \#define DNS_LOOKUP_LOCAL_EXTERN(name, namelen, addr, dns_addrtype) my_lookup_function(name, namelen, addr, dns_addrtype)
|
||||||
|
* with function signature:
|
||||||
|
* extern err_t my_lookup_function(const char *name, size_t namelen, ip_addr_t *addr, u8_t dns_addrtype)
|
||||||
* that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype).
|
* that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype).
|
||||||
*/
|
*/
|
||||||
#if !defined DNS_LOCAL_HOSTLIST || defined __DOXYGEN__
|
#if !defined DNS_LOCAL_HOSTLIST || defined __DOXYGEN__
|
||||||
|
Loading…
Reference in New Issue
Block a user