summaryrefslogtreecommitdiff
path: root/hesiod
diff options
context:
space:
mode:
Diffstat (limited to 'hesiod')
-rw-r--r--hesiod/hesiod.c66
1 files changed, 23 insertions, 43 deletions
diff --git a/hesiod/hesiod.c b/hesiod/hesiod.c
index 0d68319b48..630c71f96f 100644
--- a/hesiod/hesiod.c
+++ b/hesiod/hesiod.c
@@ -77,10 +77,8 @@ hesiod_init(void **context) {
char *cp;
ctx = malloc(sizeof(struct hesiod_p));
- if (ctx == 0) {
- __set_errno(ENOMEM);
+ if (ctx == 0)
return (-1);
- }
ctx->LHS = NULL;
ctx->RHS = NULL;
@@ -96,10 +94,8 @@ hesiod_init(void **context) {
*/
ctx->LHS = malloc(strlen(DEF_LHS)+1);
ctx->RHS = malloc(strlen(DEF_RHS)+1);
- if (ctx->LHS == 0 || ctx->RHS == 0) {
- __set_errno(ENOMEM);
+ if (ctx->LHS == 0 || ctx->RHS == 0)
goto cleanup;
- }
strcpy(ctx->LHS, DEF_LHS);
strcpy(ctx->RHS, DEF_RHS);
#else
@@ -111,18 +107,15 @@ hesiod_init(void **context) {
* variable.
*/
if ((cp = __secure_getenv("HES_DOMAIN")) != NULL) {
- if (ctx->RHS)
- free(ctx->RHS);
+ free(ctx->RHS);
ctx->RHS = malloc(strlen(cp)+2);
- if (!ctx->RHS) {
- __set_errno(ENOMEM);
+ if (!ctx->RHS)
goto cleanup;
- }
if (cp[0] == '.')
strcpy(ctx->RHS, cp);
else {
- strcpy(ctx->RHS, ".");
- strcat(ctx->RHS, cp);
+ ctx->RHS[0] = '.';
+ strcpy(ctx->RHS + 1, cp);
}
}
@@ -158,10 +151,8 @@ hesiod_end(void *context) {
if (ctx->res)
res_nclose(ctx->res);
- if (ctx->RHS)
- free(ctx->RHS);
- if (ctx->LHS)
- free(ctx->LHS);
+ free(ctx->RHS);
+ free(ctx->LHS);
if (ctx->res && ctx->free_res)
(*ctx->free_res)(ctx->res);
free(ctx);
@@ -178,6 +169,7 @@ hesiod_to_bind(void *context, const char *name, const char *type) {
char *bindname;
char **rhs_list = NULL;
const char *RHS, *cp;
+ char *endp;
/* Decide what our RHS is, and set cp to the end of the actual name. */
if ((cp = strchr(name, '@')) != NULL) {
@@ -201,25 +193,23 @@ hesiod_to_bind(void *context, const char *name, const char *type) {
*/
if ((bindname = malloc((cp - name) + strlen(type) + strlen(RHS) +
(ctx->LHS ? strlen(ctx->LHS) : 0) + 4)) == NULL) {
- __set_errno(ENOMEM);
if (rhs_list)
hesiod_free_list(context, rhs_list);
return NULL;
}
/* Now put together the DNS name. */
- memcpy(bindname, name, cp - name);
- bindname[cp - name] = '\0';
- strcat(bindname, ".");
- strcat(bindname, type);
+ endp = (char *) __mempcpy (bindname, name, cp - name);
+ *endp++ = '.';
+ endp = (char *) __stpcpy (endp, type);
if (ctx->LHS) {
if (ctx->LHS[0] != '.')
- strcat(bindname, ".");
- strcat(bindname, ctx->LHS);
+ *endp++ = '.';
+ endp = __stpcpy (endp, ctx->LHS);
}
if (RHS[0] != '.')
- strcat(bindname, ".");
- strcat(bindname, RHS);
+ *endp++ = '.';
+ strcpy (endp, RHS);
if (rhs_list)
hesiod_free_list(context, rhs_list);
@@ -279,10 +269,8 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
* Clear the existing configuration variable, just in case
* they're set.
*/
- if (ctx->RHS)
- free(ctx->RHS);
- if (ctx->LHS)
- free(ctx->LHS);
+ free(ctx->RHS);
+ free(ctx->LHS);
ctx->RHS = ctx->LHS = 0;
/*
@@ -317,10 +305,8 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
continue;
*cpp = malloc(strlen(data) + 1);
- if (!*cpp) {
- __set_errno(ENOMEM);
+ if (!*cpp)
goto cleanup;
- }
strcpy(*cpp, data);
}
fclose(fp);
@@ -328,10 +314,8 @@ parse_config_file(struct hesiod_p *ctx, const char *filename) {
cleanup:
fclose(fp);
- if (ctx->RHS)
- free(ctx->RHS);
- if (ctx->LHS)
- free(ctx->LHS);
+ free(ctx->RHS);
+ free(ctx->LHS);
ctx->RHS = ctx->LHS = 0;
return (-1);
}
@@ -394,10 +378,8 @@ get_txt_records(struct hesiod_p *ctx, int class, const char *name) {
}
list = malloc((ancount + 1) * sizeof(char *));
- if (!list) {
- __set_errno(ENOMEM);
+ if (!list)
return (NULL);
- }
j = 0;
for (i = 0; i < ancount; i++) {
skip = dn_skipname(cp, eom);
@@ -467,10 +449,8 @@ __hesiod_res_get(void *context) {
if (!ctx->res) {
struct __res_state *res;
res = (struct __res_state *)malloc(sizeof *res);
- if (res == NULL) {
- __set_errno(ENOMEM);
+ if (res == NULL)
return (NULL);
- }
memset(res, 0, sizeof *res);
__hesiod_res_set(ctx, res, free);
}