diff --git a/lib/lwres/context.c b/lib/lwres/context.c index 87c34516f3..e67bab0379 100644 --- a/lib/lwres/context.c +++ b/lib/lwres/context.c @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -31,6 +30,7 @@ #include #include +#include #include "context_p.h" #include "assert_p.h" @@ -60,10 +60,8 @@ lwres_context_create(lwres_context_t **contextp, void *arg, } ctx = malloc_function(arg, sizeof(lwres_context_t)); - if (ctx == NULL) { - errno = ENOMEM; - return (-1); - } + if (ctx == NULL) + return (LWRES_R_NOMEMORY); /* * Set up the context. @@ -79,7 +77,7 @@ lwres_context_create(lwres_context_t **contextp, void *arg, (void)context_connect(ctx); /* XXXMLG */ *contextp = ctx; - return (0); + return (LWRES_R_SUCCESS); } void @@ -172,17 +170,17 @@ context_connect(lwres_context_t *ctx) s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s < 0) - return (-1); + return (LWRES_R_IOERROR); ret = connect(s, (struct sockaddr *)&localhost, sizeof(localhost)); if (ret != 0) { close(s); - return (-1); + return (LWRES_R_IOERROR); } ctx->sock = s; - return (0); + return (LWRES_R_SUCCESS); } int @@ -198,17 +196,23 @@ lwres_context_sendrecv(lwres_context_t *ctx, if (ret < 0) return (ret); if (ret != sendlen) - return (-1); + return (LWRES_R_IOERROR); + again: fromlen = sizeof(sin); ret = recvfrom(ctx->sock, recvbase, recvlen, 0, (struct sockaddr *)&sin, &fromlen); if (ret < 0) - return (-1); + return (LWRES_R_IOERROR); + /* + * If we got something other than what we expect, re-issue our + * recvfrom() call. This can happen if an old result comes in, + * or if someone is sending us random stuff. + */ if (sin.sin_addr.s_addr != htonl(INADDR_LOOPBACK) || sin.sin_port != htons(LWRES_UDP_PORT)) - return (-1); + goto again; return (ret); } diff --git a/lib/lwres/include/lwres/Makefile.in b/lib/lwres/include/lwres/Makefile.in index bb49a5553e..901b6232dc 100644 --- a/lib/lwres/include/lwres/Makefile.in +++ b/lib/lwres/include/lwres/Makefile.in @@ -20,7 +20,7 @@ top_srcdir = @top_srcdir@ # # Only list headers that are to be installed! # -HEADERS = lwbuffer.h lwpacket.h lwres.h +HEADERS = context.h lwbuffer.h lwpacket.h lwres.h netdb.h result.h SUBDIRS = TARGETS = diff --git a/lib/lwres/include/lwres/result.h b/lib/lwres/include/lwres/result.h new file mode 100644 index 0000000000..e65d5b3366 --- /dev/null +++ b/lib/lwres/include/lwres/result.h @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2000 Internet Software Consortium. + * + * Permission to use, copy, modify, and 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM 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. + */ + +#ifndef LWRES_RESULT_H +#define LWRES_RESULT_H 1 + +#define LWRES_R_SUCCESS 0 +#define LWRES_R_NOMEMORY -1 +#define LWRES_R_TIMEDOUT -2 +#define LWRES_R_NOTFOUND -3 +#define LWRES_R_UNEXPECTEDEND -4 /* unexpected end of input */ +#define LWRES_R_FAILURE -5 /* generic failure */ +#define LWRES_R_IOERROR -6 +#define LWRES_R_NOTIMPLEMENTED -7 +#define LWRES_R_UNEXPECTED -8 + +#endif /* LWRES_RESULT_H */ diff --git a/lib/lwres/lwpacket.c b/lib/lwres/lwpacket.c index af3f8a6ff0..5de154c221 100644 --- a/lib/lwres/lwpacket.c +++ b/lib/lwres/lwpacket.c @@ -18,12 +18,12 @@ #include #include -#include #include #include #include #include +#include #include "assert_p.h" @@ -36,7 +36,7 @@ lwres_lwpacket_renderheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt) REQUIRE(pkt != NULL); if (!SPACE_OK(b, LWPACKET_LENGTH)) - return (-1); + return (LWRES_R_UNEXPECTEDEND); lwres_buffer_putuint32(b, pkt->length); lwres_buffer_putuint16(b, pkt->version); @@ -48,7 +48,7 @@ lwres_lwpacket_renderheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt) lwres_buffer_putuint16(b, pkt->authtype); lwres_buffer_putuint16(b, pkt->authlength); - return (0); + return (LWRES_R_SUCCESS); } int @@ -61,11 +61,11 @@ lwres_lwpacket_parseheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt) space = LWRES_BUFFER_REMAINING(b); if (space < LWPACKET_LENGTH) - return (-1); + return (LWRES_R_UNEXPECTEDEND); pkt->length = lwres_buffer_getuint32(b); if (pkt->length > space) - return (-1); + return (LWRES_R_UNEXPECTEDEND); pkt->version = lwres_buffer_getuint16(b); pkt->flags = lwres_buffer_getuint16(b); pkt->serial = lwres_buffer_getuint32(b); @@ -75,5 +75,5 @@ lwres_lwpacket_parseheader(lwres_buffer_t *b, lwres_lwpacket_t *pkt) pkt->authtype = lwres_buffer_getuint16(b); pkt->authlength = lwres_buffer_getuint16(b); - return (0); + return (LWRES_R_SUCCESS); } diff --git a/lib/lwres/lwres_gabn.c b/lib/lwres/lwres_gabn.c index e334d33726..d40f5dd339 100644 --- a/lib/lwres/lwres_gabn.c +++ b/lib/lwres/lwres_gabn.c @@ -18,13 +18,13 @@ #include #include -#include #include #include #include #include #include +#include #include "context_p.h" #include "assert_p.h" @@ -51,10 +51,9 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req, buflen = LWRES_LWPACKET_LENGTH + payload_length; buf = CTXMALLOC(buflen); - if (buf == NULL) { - errno = ENOMEM; - return (-1); - } + if (buf == NULL) + return (LWRES_R_NOMEMORY); + lwres_buffer_init(b, buf, buflen); pkt->length = buflen; @@ -66,7 +65,7 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req, pkt->authlength = 0; ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != 0) { + if (ret != LWRES_R_SUCCESS) { lwres_buffer_invalidate(b); CTXFREE(buf, buflen); return (ret); @@ -88,7 +87,7 @@ lwres_gabnrequest_render(lwres_context_t *ctx, lwres_gabnrequest_t *req, INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - return (0); + return (LWRES_R_SUCCESS); } int @@ -122,10 +121,8 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req, buflen = LWRES_LWPACKET_LENGTH + payload_length; buf = CTXMALLOC(buflen); - if (buf == NULL) { - errno = ENOMEM; - return (-1); - } + if (buf == NULL) + return (LWRES_R_NOMEMORY); lwres_buffer_init(b, buf, buflen); pkt->length = buflen; @@ -136,7 +133,7 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req, pkt->authlength = 0; ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != 0) { + if (ret != LWRES_R_SUCCESS) { lwres_buffer_invalidate(b); CTXFREE(buf, buflen); return (ret); @@ -175,7 +172,7 @@ lwres_gabnresponse_render(lwres_context_t *ctx, lwres_gabnresponse_t *req, INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - return (0); + return (LWRES_R_SUCCESS); } int @@ -194,10 +191,10 @@ lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, REQUIRE(structp != NULL && *structp == NULL); if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0) - return (-1); + return (LWRES_R_FAILURE); if (!SPACE_REMAINING(b, 4)) - return (-1); + return (LWRES_R_UNEXPECTEDEND); addrtypes = lwres_buffer_getuint32(b); @@ -205,22 +202,22 @@ lwres_gabnrequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, * Pull off the name itself */ ret = lwres_string_parse(b, &name, &namelen); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) return (ret); if (LWRES_BUFFER_REMAINING(b) != 0) - return (-1); + return (LWRES_R_UNEXPECTEDEND); gabn = CTXMALLOC(sizeof(lwres_gabnrequest_t)); if (gabn == NULL) - return (-1); + return (LWRES_R_NOMEMORY); gabn->addrtypes = addrtypes; gabn->name = name; gabn->namelen = namelen; *structp = gabn; - return (0); + return (LWRES_R_SUCCESS); } int @@ -241,19 +238,19 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, gabn = NULL; if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0) - return (-1); + return (LWRES_R_FAILURE); /* * Pull off the name itself */ if (!SPACE_REMAINING(b, sizeof(isc_uint16_t) * 2)) - return (-1); + return (LWRES_R_UNEXPECTEDEND); naliases = lwres_buffer_getuint16(b); naddrs = lwres_buffer_getuint16(b); gabn = CTXMALLOC(sizeof(lwres_gabnresponse_t)); if (gabn == NULL) - return (-1); + return (LWRES_R_NOMEMORY); gabn->aliases = NULL; gabn->aliaslen = NULL; gabn->addrs = NULL; @@ -264,19 +261,19 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, gabn->aliases = CTXMALLOC(sizeof(char *) * naliases); if (gabn->aliases == NULL) { - ret = -1; + ret = LWRES_R_NOMEMORY; goto out; } gabn->aliaslen = CTXMALLOC(sizeof(isc_uint16_t) * naliases); if (gabn->aliaslen == NULL) { - ret = -1; + ret = LWRES_R_NOMEMORY; goto out; } gabn->addrs = CTXMALLOC(sizeof(lwres_addr_t) * naddrs); if (gabn->addrs == NULL) { - ret = -1; + ret = LWRES_R_NOMEMORY; goto out; } @@ -284,7 +281,7 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, * Now, pull off the real name. */ ret = lwres_string_parse(b, &gabn->realname, &gabn->realnamelen); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) goto out; /* @@ -292,7 +289,7 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, */ for (x = 0 ; x < gabn->naddrs ; x++) { ret = lwres_addr_parse(b, &gabn->addrs[x]); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) goto out; } @@ -302,17 +299,17 @@ lwres_gabnresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, for (x = 0 ; x < gabn->naliases ; x++) { ret = lwres_string_parse(b, &gabn->aliases[x], &gabn->aliaslen[x]); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) goto out; } if (LWRES_BUFFER_REMAINING(b) != 0) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } *structp = gabn; - return (0); + return (LWRES_R_SUCCESS); out: if (gabn != NULL) { diff --git a/lib/lwres/lwres_gnba.c b/lib/lwres/lwres_gnba.c index 342008a663..f6562cca81 100644 --- a/lib/lwres/lwres_gnba.c +++ b/lib/lwres/lwres_gnba.c @@ -18,13 +18,13 @@ #include #include -#include #include #include #include #include #include +#include #include "context_p.h" #include "assert_p.h" @@ -51,10 +51,8 @@ lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req, buflen = LWRES_LWPACKET_LENGTH + payload_length; buf = CTXMALLOC(buflen); - if (buf == NULL) { - errno = ENOMEM; - return (-1); - } + if (buf == NULL) + return (LWRES_R_NOMEMORY); lwres_buffer_init(b, buf, buflen); pkt->length = buflen; @@ -66,7 +64,7 @@ lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req, pkt->authlength = 0; ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != 0) { + if (ret != LWRES_R_SUCCESS) { lwres_buffer_invalidate(b); CTXFREE(buf, buflen); return (ret); @@ -84,7 +82,7 @@ lwres_gnbarequest_render(lwres_context_t *ctx, lwres_gnbarequest_t *req, INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - return (0); + return (LWRES_R_SUCCESS); } int @@ -113,10 +111,8 @@ lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req, buflen = LWRES_LWPACKET_LENGTH + payload_length; buf = CTXMALLOC(buflen); - if (buf == NULL) { - errno = ENOMEM; - return (-1); - } + if (buf == NULL) + return (LWRES_R_NOMEMORY); lwres_buffer_init(b, buf, buflen); pkt->length = buflen; @@ -127,7 +123,7 @@ lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req, pkt->authlength = 0; ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != 0) { + if (ret != LWRES_R_SUCCESS) { lwres_buffer_invalidate(b); CTXFREE(buf, buflen); return (ret); @@ -153,7 +149,7 @@ lwres_gnbaresponse_render(lwres_context_t *ctx, lwres_gnbaresponse_t *req, INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - return (0); + return (LWRES_R_SUCCESS); } int @@ -169,23 +165,23 @@ lwres_gnbarequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, REQUIRE(structp != NULL && *structp == NULL); if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0) - return (-1); + return (LWRES_R_FAILURE); gnba = CTXMALLOC(sizeof(lwres_gnbarequest_t)); if (gnba == NULL) - return (-1); + return (LWRES_R_NOMEMORY); ret = lwres_addr_parse(b, &gnba->addr); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) goto out; if (LWRES_BUFFER_REMAINING(b) != 0) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } *structp = gnba; - return (0); + return (LWRES_R_SUCCESS); out: if (gnba != NULL) @@ -211,18 +207,18 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, gnba = NULL; if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0) - return (-1); + return (LWRES_R_FAILURE); /* * Pull off the name itself */ if (!SPACE_REMAINING(b, sizeof(isc_uint16_t))) - return (-1); + return (LWRES_R_UNEXPECTEDEND); naliases = lwres_buffer_getuint16(b); gnba = CTXMALLOC(sizeof(lwres_gnbaresponse_t)); if (gnba == NULL) - return (-1); + return (LWRES_R_NOMEMORY); gnba->base = NULL; gnba->aliases = NULL; gnba->aliaslen = NULL; @@ -245,7 +241,7 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, * Now, pull off the real name. */ ret = lwres_string_parse(b, &gnba->realname, &gnba->realnamelen); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) goto out; /* @@ -254,7 +250,7 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, for (x = 0 ; x < gnba->naliases ; x++) { ret = lwres_string_parse(b, &gnba->aliases[x], &gnba->aliaslen[x]); - if (ret != 0) + if (ret != LWRES_R_SUCCESS) goto out; } @@ -264,7 +260,7 @@ lwres_gnbaresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, } *structp = gnba; - return (0); + return (LWRES_R_SUCCESS); out: if (gnba != NULL) { diff --git a/lib/lwres/lwres_noop.c b/lib/lwres/lwres_noop.c index c1ec53bcef..9bcd211629 100644 --- a/lib/lwres/lwres_noop.c +++ b/lib/lwres/lwres_noop.c @@ -18,13 +18,13 @@ #include #include -#include #include #include #include #include #include +#include #include "context_p.h" #include "assert_p.h" @@ -47,10 +47,8 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req, buflen = LWRES_LWPACKET_LENGTH + payload_length; buf = CTXMALLOC(buflen); - if (buf == NULL) { - errno = ENOMEM; - return (-1); - } + if (buf == NULL) + return (LWRES_R_NOMEMORY); lwres_buffer_init(b, buf, buflen); pkt->length = buflen; @@ -62,7 +60,7 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req, pkt->authlength = 0; ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != 0) { + if (ret != LWRES_R_SUCCESS) { lwres_buffer_invalidate(b); CTXFREE(buf, buflen); return (ret); @@ -79,7 +77,7 @@ lwres_nooprequest_render(lwres_context_t *ctx, lwres_nooprequest_t *req, INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - return (0); + return (LWRES_R_SUCCESS); } int @@ -100,10 +98,8 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req, buflen = LWRES_LWPACKET_LENGTH + payload_length; buf = CTXMALLOC(buflen); - if (buf == NULL) { - errno = ENOMEM; - return (-1); - } + if (buf == NULL) + return (LWRES_R_NOMEMORY); lwres_buffer_init(b, buf, buflen); pkt->length = buflen; @@ -114,7 +110,7 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req, pkt->authlength = 0; ret = lwres_lwpacket_renderheader(b, pkt); - if (ret != 0) { + if (ret != LWRES_R_SUCCESS) { lwres_buffer_invalidate(b); CTXFREE(buf, buflen); return (ret); @@ -131,7 +127,7 @@ lwres_noopresponse_render(lwres_context_t *ctx, lwres_noopresponse_t *req, INSIST(LWRES_BUFFER_AVAILABLECOUNT(b) == 0); - return (0); + return (LWRES_R_SUCCESS); } int @@ -147,33 +143,33 @@ lwres_nooprequest_parse(lwres_context_t *ctx, lwres_buffer_t *b, REQUIRE(structp != NULL && *structp == NULL); if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) != 0) - return (-1); + return (LWRES_R_FAILURE); req = CTXMALLOC(sizeof(lwres_nooprequest_t)); if (req == NULL) - return (-1); + return (LWRES_R_NOMEMORY); if (!SPACE_REMAINING(b, sizeof(isc_uint16_t))) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } req->datalength = lwres_buffer_getuint16(b); if (!SPACE_REMAINING(b, req->datalength)) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } req->data = b->base + b->current; lwres_buffer_forward(b, req->datalength); if (LWRES_BUFFER_REMAINING(b) != 0) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } /* success! */ *structp = req; - return (0); + return (LWRES_R_SUCCESS); /* Error return */ out: @@ -194,33 +190,33 @@ lwres_noopresponse_parse(lwres_context_t *ctx, lwres_buffer_t *b, REQUIRE(structp != NULL && *structp == NULL); if ((pkt->flags & LWRES_LWPACKETFLAG_RESPONSE) == 0) - return (-1); + return (LWRES_R_FAILURE); req = CTXMALLOC(sizeof(lwres_noopresponse_t)); if (req == NULL) - return (-1); + return (LWRES_R_NOMEMORY); if (!SPACE_REMAINING(b, sizeof(isc_uint16_t))) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } req->datalength = lwres_buffer_getuint16(b); if (!SPACE_REMAINING(b, req->datalength)) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } req->data = b->base + b->current; lwres_buffer_forward(b, req->datalength); if (LWRES_BUFFER_REMAINING(b) != 0) { - ret = -1; + ret = LWRES_R_UNEXPECTEDEND; goto out; } /* success! */ *structp = req; - return (0); + return (LWRES_R_SUCCESS); /* Error return */ out: diff --git a/lib/lwres/lwresutil.c b/lib/lwres/lwresutil.c index 7152bfff85..14ca6964e0 100644 --- a/lib/lwres/lwresutil.c +++ b/lib/lwres/lwresutil.c @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -30,6 +29,7 @@ #include #include +#include #include "assert_p.h" #include "context_p.h" @@ -58,11 +58,11 @@ lwres_string_parse(lwres_buffer_t *b, char **c, isc_uint16_t *len) REQUIRE(b != NULL); if (!SPACE_REMAINING(b, sizeof(isc_uint16_t))) - return (-1); + return (LWRES_R_UNEXPECTEDEND); datalen = lwres_buffer_getuint16(b); datalen++; if (!SPACE_REMAINING(b, datalen)) - return (-1); + return (LWRES_R_UNEXPECTEDEND); string = b->base + b->current; @@ -73,7 +73,7 @@ lwres_string_parse(lwres_buffer_t *b, char **c, isc_uint16_t *len) if (c != NULL) *c = string; - return (0); + return (LWRES_R_SUCCESS); } int @@ -82,15 +82,15 @@ lwres_addr_parse(lwres_buffer_t *b, lwres_addr_t *addr) REQUIRE(addr != NULL); if (!SPACE_REMAINING(b, sizeof(isc_uint32_t) + sizeof(isc_uint16_t))) - return (-1); + return (LWRES_R_UNEXPECTEDEND); addr->family = lwres_buffer_getuint32(b); addr->length = lwres_buffer_getuint16(b); if (!SPACE_REMAINING(b, addr->length)) - return (-1); + return (LWRES_R_UNEXPECTEDEND); addr->address = b->base + b->current; lwres_buffer_forward(b, addr->length); - return (0); + return (LWRES_R_SUCCESS); } int @@ -100,8 +100,7 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name, lwres_gabnrequest_t request; lwres_gabnresponse_t *response; int ret; - int free_b; - lwres_buffer_t b; + lwres_buffer_t b_in, b_out; lwres_lwpacket_t pkt; isc_uint32_t serial; char *buffer; @@ -111,14 +110,15 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name, REQUIRE(addrtypes != 0); REQUIRE(structp != NULL && *structp == NULL); + b_in.base = NULL; + b_out.base = NULL; response = NULL; - free_b = 0; buffer = NULL; serial = (isc_uint32_t)name; buffer = CTXMALLOC(LWRES_RECVLENGTH); if (buffer == NULL) { - ret = -1; + ret = LWRES_R_NOMEMORY; goto out; } @@ -132,44 +132,44 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name, pkt.result = 0; pkt.recvlength = LWRES_RECVLENGTH; - ret = lwres_gabnrequest_render(ctx, &request, &pkt, &b); + again: + ret = lwres_gabnrequest_render(ctx, &request, &pkt, &b_out); if (ret != 0) goto out; - free_b = 1; - ret = lwres_context_sendrecv(ctx, b.base, b.length, buffer, + ret = lwres_context_sendrecv(ctx, b_out.base, b_out.length, buffer, LWRES_RECVLENGTH); if (ret < 0) goto out; - CTXFREE(b.base, b.length); - free_b = 0; - - lwres_buffer_init(&b, buffer, ret); + lwres_buffer_init(&b_in, buffer, ret); /* * Parse the packet header. */ - ret = lwres_lwpacket_parseheader(&b, &pkt); + ret = lwres_lwpacket_parseheader(&b_in, &pkt); if (ret != 0) goto out; /* * Sanity check. */ - if (pkt.serial != serial) { - ret = -1; - goto out; - } - if (pkt.opcode != LWRES_OPCODE_GETADDRSBYNAME) { - ret = -1; - goto out; - } + if (pkt.serial != serial) + goto again; + if (pkt.opcode != LWRES_OPCODE_GETADDRSBYNAME) + goto again; + + /* + * Free what we've transmitted + */ + CTXFREE(b_out.base, b_out.length); + b_out.base = NULL; + b_out.length = 0; /* * Parse the response. */ - ret = lwres_gabnresponse_parse(ctx, &b, &pkt, &response); + ret = lwres_gabnresponse_parse(ctx, &b_in, &pkt, &response); if (ret != 0) goto out; response->base = buffer; @@ -177,11 +177,11 @@ lwres_getaddrsbyname(lwres_context_t *ctx, const char *name, buffer = NULL; /* don't free this below */ *structp = response; - return (0); + return (LWRES_R_SUCCESS); out: - if (free_b != 0) - CTXFREE(b.base, b.length); + if (b_out.base != NULL) + CTXFREE(b_out.base, b_out.length); if (buffer != NULL) CTXFREE(buffer, LWRES_RECVLENGTH); if (response != NULL) @@ -199,8 +199,7 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype, lwres_gnbarequest_t request; lwres_gnbaresponse_t *response; int ret; - int free_b; - lwres_buffer_t b; + lwres_buffer_t b_in, b_out; lwres_lwpacket_t pkt; isc_uint32_t serial; char *buffer; @@ -211,14 +210,15 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype, REQUIRE(addr != NULL); REQUIRE(structp != NULL && *structp == NULL); + b_in.base = NULL; + b_out.base = NULL; response = NULL; - free_b = 0; buffer = NULL; serial = (isc_uint32_t)addr; buffer = CTXMALLOC(LWRES_RECVLENGTH); if (buffer == NULL) { - ret = -1; + ret = LWRES_R_NOMEMORY; goto out; } @@ -233,44 +233,44 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype, pkt.result = 0; pkt.recvlength = LWRES_RECVLENGTH; - ret = lwres_gnbarequest_render(ctx, &request, &pkt, &b); + again: + ret = lwres_gnbarequest_render(ctx, &request, &pkt, &b_out); if (ret != 0) goto out; - free_b = 1; - ret = lwres_context_sendrecv(ctx, b.base, b.length, buffer, + ret = lwres_context_sendrecv(ctx, b_out.base, b_out.length, buffer, LWRES_RECVLENGTH); if (ret < 0) goto out; - CTXFREE(b.base, b.length); - free_b = 0; - - lwres_buffer_init(&b, buffer, ret); + lwres_buffer_init(&b_in, buffer, ret); /* * Parse the packet header. */ - ret = lwres_lwpacket_parseheader(&b, &pkt); + ret = lwres_lwpacket_parseheader(&b_in, &pkt); if (ret != 0) goto out; /* * Sanity check. */ - if (pkt.serial != serial) { - ret = -1; - goto out; - } - if (pkt.opcode != LWRES_OPCODE_GETNAMEBYADDR) { - ret = -1; - goto out; - } + if (pkt.serial != serial) + goto again; + if (pkt.opcode != LWRES_OPCODE_GETNAMEBYADDR) + goto again; + + /* + * Free what we've transmitted + */ + CTXFREE(b_out.base, b_out.length); + b_out.base = NULL; + b_out.length = 0; /* * Parse the response. */ - ret = lwres_gnbaresponse_parse(ctx, &b, &pkt, &response); + ret = lwres_gnbaresponse_parse(ctx, &b_in, &pkt, &response); if (ret != 0) goto out; response->base = buffer; @@ -278,11 +278,11 @@ lwres_getnamebyaddr(lwres_context_t *ctx, isc_uint32_t addrtype, buffer = NULL; /* don't free this below */ *structp = response; - return (0); + return (LWRES_R_SUCCESS); out: - if (free_b != 0) - CTXFREE(b.base, b.length); + if (b_out.base != NULL) + CTXFREE(b_out.base, b_out.length); if (buffer != NULL) CTXFREE(buffer, LWRES_RECVLENGTH); if (response != NULL)