diff options
Diffstat (limited to 'usr.sbin/bind/lib/lwres/lwres_grbn.c')
-rw-r--r-- | usr.sbin/bind/lib/lwres/lwres_grbn.c | 425 |
1 files changed, 0 insertions, 425 deletions
diff --git a/usr.sbin/bind/lib/lwres/lwres_grbn.c b/usr.sbin/bind/lib/lwres/lwres_grbn.c deleted file mode 100644 index aff24328b38..00000000000 --- a/usr.sbin/bind/lib/lwres/lwres_grbn.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (C) Internet Systems Consortium, Inc. ("ISC") - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -/* $Id: lwres_grbn.c,v 1.3 2019/12/17 01:46:38 sthen Exp $ */ - -/*! \file lwres_grbn.c - - */ - -#include <config.h> - -#include <assert.h> -#include <stdlib.h> -#include <string.h> - -#include <lwres/lwbuffer.h> -#include <lwres/lwpacket.h> -#include <lwres/lwres.h> -#include <lwres/result.h> - -#include "context_p.h" -#include "assert_p.h" - -/*% Thread-save equivalent to \link lwres_gabn.c lwres_gabn* \endlink routines. */ -lwres_result_t -lwres_grbnrequest_render(lwres_context_t *ctx, lwres_grbnrequest_t *req, - lwres_lwpacket_t *pkt, lwres_buffer_t *b) -{ - unsigned char *buf; - size_t buflen; - int ret; - size_t payload_length; - lwres_uint16_t datalen; - - REQUIRE(ctx != NULL); - REQUIRE(req != NULL); - REQUIRE(req->name != NULL); - REQUIRE(pkt != NULL); - REQUIRE(b != NULL); - - datalen = strlen(req->name); - - payload_length = 4 + 2 + 2 + 2 + req->namelen + 1; - - buflen = LWRES_LWPACKET_LENGTH + payload_length; - buf = CTXMALLOC(buflen); - if (buf == NULL) - return (LWRES_R_NOMEMORY); - - lwres_buffer_init(b, buf, (unsigned int)buflen); - - pkt->length = (lwres_uint32_t)buflen; - pkt->version = LWRES_LWPACKETVERSION_0; - pkt->pktflags &= ~LWRES_LWPACKETFLAG_RESPONSE; - pkt->opcode = LWRES_OPCODE_GETRDATABYNAME; - pkt->result = 0; - pkt->authtype = 0; - pkt->authlength = 0; - - ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != LWRES_R_SUCCESS) { - lwres_buffer_invalidate(b); - CTXFREE(buf, buflen); - return (ret); - } - - INSIST(SPACE_OK(b, payload_length)); - - /* - * Flags. - */ - lwres_buffer_putuint32(b, req->flags); - - /* - * Class. - */ - lwres_buffer_putuint16(b, req->rdclass); - - /* - * Type. - */ - lwres_buffer_putuint16(b, req->rdtype); - - /* - * Put the length and the data. We know this will fit because we - * just checked for it. - */ - lwres_buffer_putuint16(b, datalen); - lwres_buffer_putmem(b, (unsigned char *)req->name, datalen); - lwres_buffer_putuint8(b, 0); /* trailing NUL */ - - INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - - return (LWRES_R_SUCCESS); -} - -/*% Thread-save equivalent to \link lwres_gabn.c lwres_gabn* \endlink routines. */ -lwres_result_t -lwres_grbnresponse_render(lwres_context_t *ctx, lwres_grbnresponse_t *req, - lwres_lwpacket_t *pkt, lwres_buffer_t *b) -{ - unsigned char *buf; - size_t buflen; - int ret; - size_t payload_length; - lwres_uint16_t datalen; - int x; - - REQUIRE(ctx != NULL); - REQUIRE(req != NULL); - REQUIRE(pkt != NULL); - REQUIRE(b != NULL); - - /* flags, class, type, ttl, nrdatas, nsigs */ - payload_length = 4 + 2 + 2 + 4 + 2 + 2; - /* real name encoding */ - payload_length += 2 + req->realnamelen + 1; - /* each rr */ - for (x = 0; x < req->nrdatas; x++) - payload_length += 2 + req->rdatalen[x]; - for (x = 0; x < req->nsigs; x++) - payload_length += 2 + req->siglen[x]; - - buflen = LWRES_LWPACKET_LENGTH + payload_length; - buf = CTXMALLOC(buflen); - if (buf == NULL) - return (LWRES_R_NOMEMORY); - lwres_buffer_init(b, buf, (unsigned int)buflen); - - pkt->length = (lwres_uint32_t)buflen; - pkt->version = LWRES_LWPACKETVERSION_0; - pkt->pktflags |= LWRES_LWPACKETFLAG_RESPONSE; - pkt->opcode = LWRES_OPCODE_GETRDATABYNAME; - pkt->authtype = 0; - pkt->authlength = 0; - - ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != LWRES_R_SUCCESS) { - lwres_buffer_invalidate(b); - CTXFREE(buf, buflen); - return (ret); - } - - /* - * Check space needed here. - */ - INSIST(SPACE_OK(b, payload_length)); - - /* Flags. */ - lwres_buffer_putuint32(b, req->flags); - - /* encode class, type, ttl, and nrdatas */ - lwres_buffer_putuint16(b, req->rdclass); - lwres_buffer_putuint16(b, req->rdtype); - lwres_buffer_putuint32(b, req->ttl); - lwres_buffer_putuint16(b, req->nrdatas); - lwres_buffer_putuint16(b, req->nsigs); - - /* encode the real name */ - datalen = req->realnamelen; - lwres_buffer_putuint16(b, datalen); - lwres_buffer_putmem(b, (unsigned char *)req->realname, datalen); - lwres_buffer_putuint8(b, 0); - - /* encode the rdatas */ - for (x = 0; x < req->nrdatas; x++) { - datalen = req->rdatalen[x]; - lwres_buffer_putuint16(b, datalen); - lwres_buffer_putmem(b, req->rdatas[x], datalen); - } - - /* encode the signatures */ - for (x = 0; x < req->nsigs; x++) { - datalen = req->siglen[x]; - lwres_buffer_putuint16(b, datalen); - lwres_buffer_putmem(b, req->sigs[x], datalen); - } - - INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - INSIST(LWRES_BUFFER_USEDCOUNT(b) == pkt->length); - - return (LWRES_R_SUCCESS); -} - -/*% Thread-save equivalent to \link lwres_gabn.c lwres_gabn* \endlink routines. */ -lwres_result_t -lwres_grbnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, - lwres_lwpacket_t *pkt, lwres_grbnrequest_t **structp) -{ - int ret; - char *name; - lwres_grbnrequest_t *grbn; - lwres_uint32_t flags; - lwres_uint16_t rdclass, rdtype; - lwres_uint16_t namelen; - - REQUIRE(ctx != NULL); - REQUIRE(pkt != NULL); - REQUIRE(b != NULL); - REQUIRE(structp != NULL && *structp == NULL); - - if ((pkt->pktflags & LWRES_LWPACKETFLAG_RESPONSE) != 0) - return (LWRES_R_FAILURE); - - if (!SPACE_REMAINING(b, 4 + 2 + 2)) - return (LWRES_R_UNEXPECTEDEND); - - /* - * Pull off the flags, class, and type. - */ - flags = lwres_buffer_getuint32(b); - rdclass = lwres_buffer_getuint16(b); - rdtype = lwres_buffer_getuint16(b); - - /* - * Pull off the name itself - */ - ret = lwres_string_parse(b, &name, &namelen); - if (ret != LWRES_R_SUCCESS) - return (ret); - - if (LWRES_BUFFER_REMAINING(b) != 0) - return (LWRES_R_TRAILINGDATA); - - grbn = CTXMALLOC(sizeof(lwres_grbnrequest_t)); - if (grbn == NULL) - return (LWRES_R_NOMEMORY); - - grbn->flags = flags; - grbn->rdclass = rdclass; - grbn->rdtype = rdtype; - grbn->name = name; - grbn->namelen = namelen; - - *structp = grbn; - return (LWRES_R_SUCCESS); -} - -/*% Thread-safe equivalent to \link lwres_gabn.c lwres_gabn* \endlink routines. */ -lwres_result_t -lwres_grbnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, - lwres_lwpacket_t *pkt, lwres_grbnresponse_t **structp) -{ - lwres_result_t ret; - unsigned int x; - lwres_uint32_t flags; - lwres_uint16_t rdclass, rdtype; - lwres_uint32_t ttl; - lwres_uint16_t nrdatas, nsigs; - lwres_grbnresponse_t *grbn; - - REQUIRE(ctx != NULL); - REQUIRE(pkt != NULL); - REQUIRE(b != NULL); - REQUIRE(structp != NULL && *structp == NULL); - - grbn = NULL; - - if ((pkt->pktflags & LWRES_LWPACKETFLAG_RESPONSE) == 0) - return (LWRES_R_FAILURE); - - /* - * Pull off the flags, class, type, ttl, nrdatas, and nsigs - */ - if (!SPACE_REMAINING(b, 4 + 2 + 2 + 4 + 2 + 2)) - return (LWRES_R_UNEXPECTEDEND); - flags = lwres_buffer_getuint32(b); - rdclass = lwres_buffer_getuint16(b); - rdtype = lwres_buffer_getuint16(b); - ttl = lwres_buffer_getuint32(b); - nrdatas = lwres_buffer_getuint16(b); - nsigs = lwres_buffer_getuint16(b); - - /* - * Pull off the name itself - */ - - grbn = CTXMALLOC(sizeof(lwres_grbnresponse_t)); - if (grbn == NULL) - return (LWRES_R_NOMEMORY); - grbn->rdatas = NULL; - grbn->rdatalen = NULL; - grbn->sigs = NULL; - grbn->siglen = NULL; - grbn->base = NULL; - - grbn->flags = flags; - grbn->rdclass = rdclass; - grbn->rdtype = rdtype; - grbn->ttl = ttl; - grbn->nrdatas = nrdatas; - grbn->nsigs = nsigs; - - if (nrdatas > 0) { - grbn->rdatas = CTXMALLOC(sizeof(char *) * nrdatas); - if (grbn->rdatas == NULL) { - ret = LWRES_R_NOMEMORY; - goto out; - } - - grbn->rdatalen = CTXMALLOC(sizeof(lwres_uint16_t) * nrdatas); - if (grbn->rdatalen == NULL) { - ret = LWRES_R_NOMEMORY; - goto out; - } - } - - if (nsigs > 0) { - grbn->sigs = CTXMALLOC(sizeof(char *) * nsigs); - if (grbn->sigs == NULL) { - ret = LWRES_R_NOMEMORY; - goto out; - } - - grbn->siglen = CTXMALLOC(sizeof(lwres_uint16_t) * nsigs); - if (grbn->siglen == NULL) { - ret = LWRES_R_NOMEMORY; - goto out; - } - } - - /* - * Now, pull off the real name. - */ - ret = lwres_string_parse(b, &grbn->realname, &grbn->realnamelen); - if (ret != LWRES_R_SUCCESS) - goto out; - - /* - * Parse off the rdatas. - */ - for (x = 0; x < grbn->nrdatas; x++) { - ret = lwres_data_parse(b, &grbn->rdatas[x], - &grbn->rdatalen[x]); - if (ret != LWRES_R_SUCCESS) - goto out; - } - - /* - * Parse off the signatures. - */ - for (x = 0; x < grbn->nsigs; x++) { - ret = lwres_data_parse(b, &grbn->sigs[x], &grbn->siglen[x]); - if (ret != LWRES_R_SUCCESS) - goto out; - } - - if (LWRES_BUFFER_REMAINING(b) != 0) { - ret = LWRES_R_TRAILINGDATA; - goto out; - } - - *structp = grbn; - return (LWRES_R_SUCCESS); - - out: - if (grbn != NULL) { - if (grbn->rdatas != NULL) - CTXFREE(grbn->rdatas, sizeof(char *) * nrdatas); - if (grbn->rdatalen != NULL) - CTXFREE(grbn->rdatalen, - sizeof(lwres_uint16_t) * nrdatas); - if (grbn->sigs != NULL) - CTXFREE(grbn->sigs, sizeof(char *) * nsigs); - if (grbn->siglen != NULL) - CTXFREE(grbn->siglen, sizeof(lwres_uint16_t) * nsigs); - CTXFREE(grbn, sizeof(lwres_grbnresponse_t)); - } - - return (ret); -} - -/*% Thread-save equivalent to \link lwres_gabn.c lwres_gabn* \endlink routines. */ -void -lwres_grbnrequest_free(lwres_context_t *ctx, lwres_grbnrequest_t **structp) -{ - lwres_grbnrequest_t *grbn; - - REQUIRE(ctx != NULL); - REQUIRE(structp != NULL && *structp != NULL); - - grbn = *structp; - *structp = NULL; - - CTXFREE(grbn, sizeof(lwres_grbnrequest_t)); -} - -/*% Thread-save equivalent to \link lwres_gabn.c lwres_gabn* \endlink routines. */ -void -lwres_grbnresponse_free(lwres_context_t *ctx, lwres_grbnresponse_t **structp) -{ - lwres_grbnresponse_t *grbn; - - REQUIRE(ctx != NULL); - REQUIRE(structp != NULL && *structp != NULL); - - grbn = *structp; - *structp = NULL; - - if (grbn->nrdatas > 0) { - CTXFREE(grbn->rdatas, sizeof(char *) * grbn->nrdatas); - CTXFREE(grbn->rdatalen, - sizeof(lwres_uint16_t) * grbn->nrdatas); - } - if (grbn->nsigs > 0) { - CTXFREE(grbn->sigs, sizeof(char *) * grbn->nsigs); - CTXFREE(grbn->siglen, sizeof(lwres_uint16_t) * grbn->nsigs); - } - if (grbn->base != NULL) - CTXFREE(grbn->base, grbn->baselen); - CTXFREE(grbn, sizeof(lwres_grbnresponse_t)); -} |