diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2014-12-15 01:39:42 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2015-02-11 11:12:04 +0100 |
commit | 5594736ea2618bb3e487f47fd199e1d2cf4c58fd (patch) | |
tree | 20e4f3303994f7855b80aca3038507e38193b424 | |
parent | bf54fbed126ec3d459af40ea370ffadacd31c76d (diff) | |
download | sssd-5594736ea2618bb3e487f47fd199e1d2cf4c58fd.tar.gz sssd-5594736ea2618bb3e487f47fd199e1d2cf4c58fd.tar.xz sssd-5594736ea2618bb3e487f47fd199e1d2cf4c58fd.zip |
RESOLV: Remove obsolete in-tree implementation of SRV and TXT parsing
SSSD contained several backwards-compatible definitions of SRV and TXT
APIs as well as structures that carry TTL data. These were intended for
RHEL-5 and older releases. Since we don't support those upstream, it's
better to remove the code -- it has drifted apart from upstream anyway.
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
-rw-r--r-- | Makefile.am | 12 | ||||
-rw-r--r-- | src/external/libcares.m4 | 14 | ||||
-rw-r--r-- | src/resolv/ares/ares_data.c | 140 | ||||
-rw-r--r-- | src/resolv/ares/ares_data.h | 68 | ||||
-rw-r--r-- | src/resolv/ares/ares_dns.h | 91 | ||||
-rw-r--r-- | src/resolv/ares/ares_parse_srv_reply.c | 183 | ||||
-rw-r--r-- | src/resolv/ares/ares_parse_srv_reply.h | 35 | ||||
-rw-r--r-- | src/resolv/ares/ares_parse_txt_reply.c | 204 | ||||
-rw-r--r-- | src/resolv/ares/ares_parse_txt_reply.h | 33 | ||||
-rw-r--r-- | src/resolv/async_resolv.c | 19 | ||||
-rw-r--r-- | src/resolv/async_resolv.h | 6 |
11 files changed, 0 insertions, 805 deletions
diff --git a/Makefile.am b/Makefile.am index 0975dc2ba..caeebce35 100644 --- a/Makefile.am +++ b/Makefile.am @@ -419,11 +419,6 @@ SSSD_LCL_TOOLS_OBJ = \ SSSD_RESOLV_OBJ = \ src/resolv/async_resolv.c \ src/resolv/async_resolv_utils.c -if BUILD_ARES_DATA - SSSD_RESOLV_OBJ += \ - src/resolv/ares/ares_parse_srv_reply.c \ - src/resolv/ares/ares_data.c -endif SSSD_FAILOVER_OBJ = \ src/providers/fail_over.c \ @@ -588,9 +583,6 @@ dist_noinst_HEADERS = \ src/tools/tools_util.h \ src/tools/sss_sync_ops.h \ src/resolv/async_resolv.h \ - src/resolv/ares/ares_parse_srv_reply.h \ - src/resolv/ares/ares_parse_txt_reply.h \ - src/resolv/ares/ares_data.h \ src/tests/common.h \ src/tests/common_check.h \ src/tests/cmocka/common_mock.h \ @@ -1414,10 +1406,6 @@ files_tests_LDADD = \ SSSD_RESOLV_TESTS_OBJ = \ $(SSSD_RESOLV_OBJ) -if BUILD_ARES_DATA - SSSD_RESOLV_TESTS_OBJ += \ - src/resolv/ares/ares_parse_txt_reply.c -endif resolv_tests_SOURCES = \ src/tests/resolv-tests.c \ diff --git a/src/external/libcares.m4 b/src/external/libcares.m4 index b235ee215..0a764d34c 100644 --- a/src/external/libcares.m4 +++ b/src/external/libcares.m4 @@ -13,17 +13,3 @@ AS_IF([test x"$found_libcares" != xyes], [-L$sss_extra_libdir])], [AC_MSG_ERROR([c-ares header files are not installed])])] ) - -dnl Check if this particular version of c-ares supports the generic ares_free_data function -AC_CHECK_LIB([cares], - [ares_free_data], - [AC_DEFINE([HAVE_ARES_DATA], 1, [Does c-ares have ares_free_data()?]) - ], - [ares_data=1], - [$CARES_LIBS] -) - -AM_CONDITIONAL(BUILD_ARES_DATA, test x$ares_data = x1) - -dnl Check if this particular version of c-ares support the new TTL structures -AC_CHECK_TYPES([struct ares_addrttl, struct ares_addr6ttl], [], [], [#include <ares.h>]) diff --git a/src/resolv/ares/ares_data.c b/src/resolv/ares/ares_data.c deleted file mode 100644 index 1cccaa55c..000000000 --- a/src/resolv/ares/ares_data.c +++ /dev/null @@ -1,140 +0,0 @@ -/* $Id: ares_data.c,v 1.2 2009-11-20 09:06:33 yangtse Exp $ */ - -/* Copyright (C) 2009 by Daniel Stenberg - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - - -#include <stddef.h> -#include <stdlib.h> - -#include "ares.h" -#include "ares_data.h" - -/* -** ares_free_data() - c-ares external API function. -** -** This function must be used by the application to free data memory that -** has been internally allocated by some c-ares function and for which a -** pointer has already been returned to the calling application. The list -** of c-ares functions returning pointers that must be free'ed using this -** function is: -** -** ares_parse_srv_reply() -** ares_parse_txt_reply() -*/ - -void _ares_free_data(void *dataptr) -{ - struct ares_data *ptr; - - if (!dataptr) - return; - - ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data)); - - if (ptr->mark != ARES_DATATYPE_MARK) - return; - - switch (ptr->type) - { - case ARES_DATATYPE_SRV_REPLY: - - if (ptr->data.srv_reply.next) - _ares_free_data(ptr->data.srv_reply.next); - if (ptr->data.srv_reply.host) - free(ptr->data.srv_reply.host); - break; - - case ARES_DATATYPE_TXT_REPLY: - - if (ptr->data.txt_reply.next) - _ares_free_data(ptr->data.txt_reply.next); - if (ptr->data.txt_reply.txt) - free(ptr->data.txt_reply.txt); - break; - - default: - return; - } - - free(ptr); -} - - -/* -** ares_malloc_data() - c-ares internal helper function. -** -** This function allocates memory for a c-ares private ares_data struct -** for the specified ares_datatype, initializes c-ares private fields -** and zero initializes those which later might be used from the public -** API. It returns an interior pointer which can be passed by c-ares -** functions to the calling application, and that must be free'ed using -** c-ares external API function ares_free_data(). -*/ - -void *_ares_malloc_data(ares_datatype type) -{ - struct ares_data *ptr; - - ptr = malloc(sizeof(struct ares_data)); - if (!ptr) - return NULL; - - switch (type) - { - case ARES_DATATYPE_SRV_REPLY: - ptr->data.srv_reply.next = NULL; - ptr->data.srv_reply.host = NULL; - ptr->data.srv_reply.priority = 0; - ptr->data.srv_reply.weight = 0; - ptr->data.srv_reply.port = 0; - break; - - case ARES_DATATYPE_TXT_REPLY: - ptr->data.txt_reply.next = NULL; - ptr->data.txt_reply.txt = NULL; - ptr->data.txt_reply.length = 0; - break; - - default: - free(ptr); - return NULL; - } - - ptr->mark = ARES_DATATYPE_MARK; - ptr->type = type; - - return &ptr->data; -} - - -/* -** ares_get_datatype() - c-ares internal helper function. -** -** This function returns the ares_datatype of the data stored in a -** private ares_data struct when given the public API pointer. -*/ - -ares_datatype ares_get_datatype(void * dataptr) -{ - struct ares_data *ptr; - - ptr = (void *)((char *)dataptr - offsetof(struct ares_data, data)); - - if (ptr->mark == ARES_DATATYPE_MARK) - return ptr->type; - - return ARES_DATATYPE_UNKNOWN; -} diff --git a/src/resolv/ares/ares_data.h b/src/resolv/ares/ares_data.h deleted file mode 100644 index d3606314e..000000000 --- a/src/resolv/ares/ares_data.h +++ /dev/null @@ -1,68 +0,0 @@ -/* $Id: ares_data.h,v 1.2 2009-11-23 12:03:33 yangtse Exp $ */ - -/* Copyright (C) 2009 by Daniel Stenberg - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#ifndef HAVE_ARES_DATA -#include "resolv/ares/ares_parse_txt_reply.h" -#include "resolv/ares/ares_parse_srv_reply.h" -#endif /* HAVE_ARES_DATA */ - -typedef enum { - ARES_DATATYPE_UNKNOWN = 1, /* unknown data type - introduced in 1.7.0 */ - ARES_DATATYPE_SRV_REPLY, /* struct ares_srv_reply - introduced in 1.7.0 */ - ARES_DATATYPE_TXT_REPLY, /* struct ares_txt_reply - introduced in 1.7.0 */ -#if 0 - ARES_DATATYPE_ADDR6TTL, /* struct ares_addrttl */ - ARES_DATATYPE_ADDRTTL, /* struct ares_addr6ttl */ - ARES_DATATYPE_HOSTENT, /* struct hostent */ - ARES_DATATYPE_OPTIONS, /* struct ares_options */ -#endif - ARES_DATATYPE_LAST /* not used - introduced in 1.7.0 */ -} ares_datatype; - -#define ARES_DATATYPE_MARK 0xbead - -/* - * ares_data struct definition is internal to c-ares and shall not - * be exposed by the public API in order to allow future changes - * and extensions to it without breaking ABI. This will be used - * internally by c-ares as the container of multiple types of data - * dynamically allocated for which a reference will be returned - * to the calling application. - * - * c-ares API functions returning a pointer to c-ares internally - * allocated data will actually be returning an interior pointer - * into this ares_data struct. - * - * All this is 'invisible' to the calling application, the only - * requirement is that this kind of data must be free'ed by the - * calling application using ares_free_data() with the pointer - * it has received from a previous c-ares function call. - */ - -struct ares_data { - ares_datatype type; /* Actual data type identifier. */ - unsigned int mark; /* Private ares_data signature. */ - union { - struct ares_txt_reply txt_reply; - struct ares_srv_reply srv_reply; - } data; -}; - -void *_ares_malloc_data(ares_datatype type); -void _ares_free_data(void *dataptr); - -ares_datatype ares_get_datatype(void * dataptr); diff --git a/src/resolv/ares/ares_dns.h b/src/resolv/ares/ares_dns.h deleted file mode 100644 index c0a9dda65..000000000 --- a/src/resolv/ares/ares_dns.h +++ /dev/null @@ -1,91 +0,0 @@ -/* $Id: ares_dns.h,v 1.8 2007-02-16 14:22:08 yangtse Exp $ */ - -/* Copyright 1998 by the Massachusetts Institute of Technology. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#ifndef ARES__DNS_H -#define ARES__DNS_H - -#define DNS__16BIT(p) (((p)[0] << 8) | (p)[1]) -#define DNS__32BIT(p) (((p)[0] << 24) | ((p)[1] << 16) | \ - ((p)[2] << 8) | (p)[3]) - -#define DNS__SET16BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[1] = (unsigned char)((v) & 0xff))) -#define DNS__SET32BIT(p, v) (((p)[0] = (unsigned char)(((v) >> 24) & 0xff)), \ - ((p)[1] = (unsigned char)(((v) >> 16) & 0xff)), \ - ((p)[2] = (unsigned char)(((v) >> 8) & 0xff)), \ - ((p)[3] = (unsigned char)((v) & 0xff))) - -#if 0 -/* we cannot use this approach on systems where we can't access 16/32 bit - data on un-aligned addresses */ -#define DNS__16BIT(p) ntohs(*(unsigned short*)(p)) -#define DNS__32BIT(p) ntohl(*(unsigned long*)(p)) -#define DNS__SET16BIT(p, v) *(unsigned short*)(p) = htons(v) -#define DNS__SET32BIT(p, v) *(unsigned long*)(p) = htonl(v) -#endif - -/* Macros for parsing a DNS header */ -#define DNS_HEADER_QID(h) DNS__16BIT(h) -#define DNS_HEADER_QR(h) (((h)[2] >> 7) & 0x1) -#define DNS_HEADER_OPCODE(h) (((h)[2] >> 3) & 0xf) -#define DNS_HEADER_AA(h) (((h)[2] >> 2) & 0x1) -#define DNS_HEADER_TC(h) (((h)[2] >> 1) & 0x1) -#define DNS_HEADER_RD(h) ((h)[2] & 0x1) -#define DNS_HEADER_RA(h) (((h)[3] >> 7) & 0x1) -#define DNS_HEADER_Z(h) (((h)[3] >> 4) & 0x7) -#define DNS_HEADER_RCODE(h) ((h)[3] & 0xf) -#define DNS_HEADER_QDCOUNT(h) DNS__16BIT((h) + 4) -#define DNS_HEADER_ANCOUNT(h) DNS__16BIT((h) + 6) -#define DNS_HEADER_NSCOUNT(h) DNS__16BIT((h) + 8) -#define DNS_HEADER_ARCOUNT(h) DNS__16BIT((h) + 10) - -/* Macros for constructing a DNS header */ -#define DNS_HEADER_SET_QID(h, v) DNS__SET16BIT(h, v) -#define DNS_HEADER_SET_QR(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_OPCODE(h, v) ((h)[2] |= (unsigned char)(((v) & 0xf) << 3)) -#define DNS_HEADER_SET_AA(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 2)) -#define DNS_HEADER_SET_TC(h, v) ((h)[2] |= (unsigned char)(((v) & 0x1) << 1)) -#define DNS_HEADER_SET_RD(h, v) ((h)[2] |= (unsigned char)((v) & 0x1)) -#define DNS_HEADER_SET_RA(h, v) ((h)[3] |= (unsigned char)(((v) & 0x1) << 7)) -#define DNS_HEADER_SET_Z(h, v) ((h)[3] |= (unsigned char)(((v) & 0x7) << 4)) -#define DNS_HEADER_SET_RCODE(h, v) ((h)[3] |= (unsigned char)((v) & 0xf)) -#define DNS_HEADER_SET_QDCOUNT(h, v) DNS__SET16BIT((h) + 4, v) -#define DNS_HEADER_SET_ANCOUNT(h, v) DNS__SET16BIT((h) + 6, v) -#define DNS_HEADER_SET_NSCOUNT(h, v) DNS__SET16BIT((h) + 8, v) -#define DNS_HEADER_SET_ARCOUNT(h, v) DNS__SET16BIT((h) + 10, v) - -/* Macros for parsing the fixed part of a DNS question */ -#define DNS_QUESTION_TYPE(q) DNS__16BIT(q) -#define DNS_QUESTION_CLASS(q) DNS__16BIT((q) + 2) - -/* Macros for constructing the fixed part of a DNS question */ -#define DNS_QUESTION_SET_TYPE(q, v) DNS__SET16BIT(q, v) -#define DNS_QUESTION_SET_CLASS(q, v) DNS__SET16BIT((q) + 2, v) - -/* Macros for parsing the fixed part of a DNS resource record */ -#define DNS_RR_TYPE(r) DNS__16BIT(r) -#define DNS_RR_CLASS(r) DNS__16BIT((r) + 2) -#define DNS_RR_TTL(r) DNS__32BIT((r) + 4) -#define DNS_RR_LEN(r) DNS__16BIT((r) + 8) - -/* Macros for constructing the fixed part of a DNS resource record */ -#define DNS_RR_SET_TYPE(r) DNS__SET16BIT(r, v) -#define DNS_RR_SET_CLASS(r) DNS__SET16BIT((r) + 2, v) -#define DNS_RR_SET_TTL(r) DNS__SET32BIT((r) + 4, v) -#define DNS_RR_SET_LEN(r) DNS__SET16BIT((r) + 8, v) - -#endif /* ARES__DNS_H */ diff --git a/src/resolv/ares/ares_parse_srv_reply.c b/src/resolv/ares/ares_parse_srv_reply.c deleted file mode 100644 index 7e01e1a6d..000000000 --- a/src/resolv/ares/ares_parse_srv_reply.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - SSSD - - Async resolver - SRV records parsing - - Authors: - Jakub Hrozek <jhrozek@redhat.com> - - Copyright (C) Red Hat, Inc 2009 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -/* - * This code is based on other c-ares parsing licensed as follows: - - * Copyright 1998 by the Massachusetts Institute of Technology. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - - -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <arpa/nameser.h> -#include <stdlib.h> -#include <string.h> -#include "ares.h" -/* this drags in some private macros c-ares uses */ -#include "ares_dns.h" -#include "ares_data.h" - -#include "ares_parse_srv_reply.h" - -int _ares_parse_srv_reply (const unsigned char *abuf, int alen, - struct ares_srv_reply **srv_out) -{ - unsigned int qdcount, ancount, i; - const unsigned char *aptr, *vptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_srv_reply *srv_head = NULL; - struct ares_srv_reply *srv_last = NULL; - struct ares_srv_reply *srv_curr; - - /* Set *srv_out to NULL for all failure cases. */ - *srv_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT (abuf); - ancount = DNS_HEADER_ANCOUNT (abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name (aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < (int) ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name (aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE (aptr); - rr_class = DNS_RR_CLASS (aptr); - rr_len = DNS_RR_LEN (aptr); - aptr += RRFIXEDSZ; - - /* Check if we are really looking at a SRV record */ - if (rr_class == C_IN && rr_type == T_SRV) - { - /* parse the SRV record itself */ - if (rr_len < 6) - { - status = ARES_EBADRESP; - break; - } - - /* Allocate storage for this SRV answer appending it to the list */ - srv_curr = _ares_malloc_data(ARES_DATATYPE_SRV_REPLY); - if (!srv_curr) - { - status = ARES_ENOMEM; - break; - } - if (srv_last) - { - srv_last->next = srv_curr; - } - else - { - srv_head = srv_curr; - } - srv_last = srv_curr; - - vptr = aptr; - srv_curr->priority = DNS__16BIT(vptr); - vptr += sizeof(const unsigned short); - srv_curr->weight = DNS__16BIT(vptr); - vptr += sizeof(const unsigned short); - srv_curr->port = DNS__16BIT(vptr); - vptr += sizeof(const unsigned short); - - status = ares_expand_name (vptr, abuf, alen, &srv_curr->host, &len); - if (status != ARES_SUCCESS) - break; - } - - /* Don't lose memory in the next iteration */ - free(rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - free (hostname); - if (rr_name) - free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (srv_head) - _ares_free_data (srv_head); - return status; - } - - /* everything looks fine, return the data */ - *srv_out = srv_head; - - return ARES_SUCCESS; -} diff --git a/src/resolv/ares/ares_parse_srv_reply.h b/src/resolv/ares/ares_parse_srv_reply.h deleted file mode 100644 index 29c6e08d1..000000000 --- a/src/resolv/ares/ares_parse_srv_reply.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - Authors: - Jakub Hrozek <jhrozek@redhat.com> - - Copyright (C) 2009 Red Hat - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __ARES_PARSE_SRV_REPLY_H__ -#define __ARES_PARSE_SRV_REPLY_H__ - -struct ares_srv_reply { - struct ares_srv_reply *next; - char *host; - unsigned short priority; - unsigned short weight; - unsigned short port; -}; - -int _ares_parse_srv_reply (const unsigned char *abuf, int alen, - struct ares_srv_reply **srv_out); - -#endif /* __ARES_PARSE_SRV_REPLY_H__ */ diff --git a/src/resolv/ares/ares_parse_txt_reply.c b/src/resolv/ares/ares_parse_txt_reply.c deleted file mode 100644 index d710e8f98..000000000 --- a/src/resolv/ares/ares_parse_txt_reply.c +++ /dev/null @@ -1,204 +0,0 @@ -/* - SSSD - - Async resolver - TXT records parsing - - Authors: - Jakub Hrozek <jhrozek@redhat.com> - - Copyright (C) Red Hat, Inc 2009 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -/* - * This code is based on other c-ares parsing licensed as follows: - - * Copyright 1998 by the Massachusetts Institute of Technology. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in - * advertising or publicity pertaining to distribution of the - * software without specific, written prior permission. - * M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <netdb.h> -#include <arpa/nameser.h> -#include <stdlib.h> -#include <string.h> -#include "ares.h" -/* this drags in some private macros c-ares uses */ -#include "ares_dns.h" -#include "ares_data.h" - -#include "ares_parse_txt_reply.h" - -int _ares_parse_txt_reply (const unsigned char *abuf, int alen, - struct ares_txt_reply **txt_out) -{ - size_t substr_len, str_len; - unsigned int qdcount, ancount, i; - const unsigned char *aptr; - const unsigned char *strptr; - int status, rr_type, rr_class, rr_len; - long len; - char *hostname = NULL, *rr_name = NULL; - struct ares_txt_reply *txt_head = NULL; - struct ares_txt_reply *txt_last = NULL; - struct ares_txt_reply *txt_curr; - - /* Set *txt_out to NULL for all failure cases. */ - *txt_out = NULL; - - /* Give up if abuf doesn't have room for a header. */ - if (alen < HFIXEDSZ) - return ARES_EBADRESP; - - /* Fetch the question and answer count from the header. */ - qdcount = DNS_HEADER_QDCOUNT(abuf); - ancount = DNS_HEADER_ANCOUNT(abuf); - if (qdcount != 1) - return ARES_EBADRESP; - if (ancount == 0) - return ARES_ENODATA; - - /* Expand the name from the question, and skip past the question. */ - aptr = abuf + HFIXEDSZ; - status = ares_expand_name(aptr, abuf, alen, &hostname, &len); - if (status != ARES_SUCCESS) - return status; - - if (aptr + len + QFIXEDSZ > abuf + alen) - { - free (hostname); - return ARES_EBADRESP; - } - aptr += len + QFIXEDSZ; - - /* Examine each answer resource record (RR) in turn. */ - for (i = 0; i < (int) ancount; i++) - { - /* Decode the RR up to the data field. */ - status = ares_expand_name(aptr, abuf, alen, &rr_name, &len); - if (status != ARES_SUCCESS) - { - break; - } - aptr += len; - if (aptr + RRFIXEDSZ > abuf + alen) - { - status = ARES_EBADRESP; - break; - } - rr_type = DNS_RR_TYPE(aptr); - rr_class = DNS_RR_CLASS(aptr); - rr_len = DNS_RR_LEN(aptr); - aptr += RRFIXEDSZ; - - /* Check if we are really looking at a TXT record */ - if (rr_class == C_IN && rr_type == T_TXT) - { - /* Allocate storage for this TXT answer appending it to the list */ - txt_curr = _ares_malloc_data(ARES_DATATYPE_TXT_REPLY); - if (!txt_curr) - { - status = ARES_ENOMEM; - break; - } - if (txt_last) - { - txt_last->next = txt_curr; - } - else - { - txt_head = txt_curr; - } - txt_last = txt_curr; - - /* - * There may be multiple substrings in a single TXT record. Each - * substring may be up to 255 characters in length, with a - * "length byte" indicating the size of the substring payload. - * RDATA contains both the length-bytes and payloads of all - * substrings contained therein. - */ - - /* Compute total length to allow a single memory allocation */ - strptr = aptr; - while (strptr < (aptr + rr_len)) - { - substr_len = (unsigned char)*strptr; - txt_curr->length += substr_len; - strptr += substr_len + 1; - } - - /* Including null byte */ - txt_curr->txt = malloc (txt_curr->length + 1); - if (txt_curr->txt == NULL) - { - status = ARES_ENOMEM; - break; - } - - /* Step through the list of substrings, concatenating them */ - str_len = 0; - strptr = aptr; - while (strptr < (aptr + rr_len)) - { - substr_len = (unsigned char)*strptr; - strptr++; - memcpy ((char *) txt_curr->txt + str_len, strptr, substr_len); - str_len += substr_len; - strptr += substr_len; - } - /* Make sure we NULL-terminate */ - *((char *) txt_curr->txt + txt_curr->length) = '\0'; - } - - /* Don't lose memory in the next iteration */ - free(rr_name); - rr_name = NULL; - - /* Move on to the next record */ - aptr += rr_len; - } - - if (hostname) - free (hostname); - if (rr_name) - free (rr_name); - - /* clean up on error */ - if (status != ARES_SUCCESS) - { - if (txt_head) - _ares_free_data (txt_head); - return status; - } - - /* everything looks fine, return the data */ - *txt_out = txt_head; - - return ARES_SUCCESS; -} diff --git a/src/resolv/ares/ares_parse_txt_reply.h b/src/resolv/ares/ares_parse_txt_reply.h deleted file mode 100644 index 216e2c0d1..000000000 --- a/src/resolv/ares/ares_parse_txt_reply.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - Authors: - Jakub Hrozek <jhrozek@redhat.com> - - Copyright (C) 2009 Red Hat - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __ARES_PARSE_TXT_REPLY_H__ -#define __ARES_PARSE_TXT_REPLY_H__ - -struct ares_txt_reply { - struct ares_txt_reply *next; - unsigned char *txt; - size_t length; /* length excludes null termination */ -}; - -int _ares_parse_txt_reply(const unsigned char* abuf, int alen, - struct ares_txt_reply **txt_out); - -#endif /* __ARES_PARSE_TXT_REPLY_H__ */ diff --git a/src/resolv/async_resolv.c b/src/resolv/async_resolv.c index 85c4d99a4..c9657ef41 100644 --- a/src/resolv/async_resolv.c +++ b/src/resolv/async_resolv.c @@ -42,25 +42,6 @@ #include "util/dlinklist.h" #include "util/util.h" -#ifndef HAVE_ARES_DATA -#define ares_parse_srv_reply(abuf, alen, srv_out) \ - _ares_parse_srv_reply(abuf, alen, srv_out) -#define ares_parse_txt_reply(abuf, alen, txt_out) \ - _ares_parse_txt_reply(abuf, alen, txt_out) -#define ares_free_data(dataptr) \ - _ares_free_data(dataptr) -#define ares_malloc_data(data) \ - _ares_malloc_data(data) -#endif /* HAVE_ARES_DATA */ - -#ifndef HAVE_STRUCT_ARES_ADDRTTL -#define ares_addrttl addrttl -#endif - -#ifndef HAVE_STRUCT_ARES_ADDR6TTL -#define ares_addr6ttl addr6ttl -#endif - #define DNS__16BIT(p) (((p)[0] << 8) | (p)[1]) /* diff --git a/src/resolv/async_resolv.h b/src/resolv/async_resolv.h index 9b08f12ae..109779bb9 100644 --- a/src/resolv/async_resolv.h +++ b/src/resolv/async_resolv.h @@ -32,12 +32,6 @@ #include "config.h" #include "confdb/confdb.h" -#ifndef HAVE_ARES_DATA -#include "resolv/ares/ares_parse_srv_reply.h" -#include "resolv/ares/ares_parse_txt_reply.h" -#include "resolv/ares/ares_data.h" -#endif /* HAVE_ARES_DATA */ - #ifndef RESOLV_DEFAULT_TTL #define RESOLV_DEFAULT_TTL 7200 #endif /* RESOLV_DEFAULT_TTL */ |