*/
found = fr_dict_enum_by_name(enumv, value, len);
if (found) {
- if (fr_value_box_copy(ctx, out, found->value) < 0) return -1;
+ if (unlikely(fr_value_box_copy(ctx, out, found->value)) < 0) return -1;
return 0;
}
break;
}
- fr_value_box_copy(map->rhs, tmpl_value(map->rhs), &vp->data);
+ if (unlikely(fr_value_box_copy(map->rhs, tmpl_value(map->rhs), &vp->data) < 0)) {
+ talloc_free(map);
+ return -1;
+ }
*out = map;
MEM(n = fr_pair_afrom_da(ctx, tmpl_attr_tail_da(map->lhs)));
if (tmpl_attr_tail_da(map->lhs)->type == tmpl_value_type(map->rhs)) {
- if (fr_value_box_copy(n, &n->data, tmpl_value(map->rhs)) < 0) {
+ if (unlikely(fr_value_box_copy(n, &n->data, tmpl_value(map->rhs)) < 0)) {
rcode = -1;
+ talloc_free(n);
goto error;
}
* getting the buffer value from may be freed
* before this map is applied.
*/
- if (fr_value_box_copy(n_mod->rhs, tmpl_value(n_mod->rhs), &vp->data) < 0) goto error;
+ if (unlikely(fr_value_box_copy(n_mod->rhs, tmpl_value(n_mod->rhs), &vp->data) < 0)) goto error;
map_list_insert_tail(&n->mod, n_mod);
MAP_VERIFY(n_mod);
if (fr_value_box_cast(n_vb, n_vb,
mutated->cast ? mutated->cast : tmpl_attr_tail_da(mutated->lhs)->type,
tmpl_attr_tail_da(mutated->lhs), &vp->data) < 0) {
+ assign_error:
RPEDEBUG("Assigning value to \"%s\" failed", tmpl_attr_tail_da(mutated->lhs)->name);
goto attr_error;
}
} else {
- fr_value_box_copy(n_vb, n_vb, &vp->data);
+ if (unlikely(fr_value_box_copy(n_vb, n_vb, &vp->data) < 0)) goto assign_error;
}
fr_dcursor_append(&values, n_vb);
} while ((vp = fr_dcursor_next(&from)));
* on the static/global buffers and possibly
* lead to threading issues.
*/
- if (fr_value_box_copy(n_vb, n_vb, vb) < 0) goto data_error;
+ if (unlikely(fr_value_box_copy(n_vb, n_vb, vb) < 0)) goto data_error;
}
fr_dcursor_append(&values, n_vb);
}
* If tmpl_value were a pointer we could
* assign values directly.
*/
- fr_value_box_copy(map_list_head(&n->mod)->rhs, tmpl_value(map_list_head(&n->mod)->rhs), fr_value_box_list_head(&head));
+ if (unlikely(fr_value_box_copy(map_list_head(&n->mod)->rhs, tmpl_value(map_list_head(&n->mod)->rhs),
+ fr_value_box_list_head(&head)) < 0)) {
+ goto error;
+ }
+
/*
* value boxes in tmpls cannot now be the head of a list
*
fr_pair_t *vp;
MEM(vp = fr_pair_afrom_da(ctx, tmpl_attr_tail_da(attr)));
- if (fr_value_box_copy(vp, &vp->data, value) < 0) {
+ if (unlikely(fr_value_box_copy(vp, &vp->data, value) < 0)) {
talloc_free(vp);
return NULL;
}
switch (pair_update_control(&vp, type_da)) {
case 0:
- fr_value_box_copy(vp, &vp->data, enumv->value);
+ if (unlikely(fr_value_box_copy(vp, &vp->data, enumv->value) < 0)) {
+ fr_strerror_printf("Failed to set control.%pP to %s", vp, enumv->name);
+ return false;
+ }
vp->data.enumv = vp->da; /* So we get the correct string alias */
RDEBUG2("Setting control.%pP", vp);
return true;
if (cast_type == FR_TYPE_NULL) {
if (needs_dup) {
- fr_value_box_copy(vb_out, vb_out, vb_in);
+ if (unlikely(fr_value_box_copy(vb_out, vb_out, vb_in) < 0)) {
+ talloc_free(vb_out);
+ goto failed_cast;
+ }
} else {
fr_value_box_steal(vb_out, vb_out, vb_in);
}
if (needs_dup) {
fr_assert(vb_in != &value);
- ret = fr_value_box_copy(ctx, &value, vb_in);
- if (ret < 0) goto failed_cast;
-
+ if (unlikely(fr_value_box_copy(ctx, &value, vb_in) < 0)) goto failed_cast;
vb_in = &value;
} else {
fr_assert(dst_type == FR_TYPE_STRING);
} else {
value = fr_value_box_alloc(ctx, vp->data.type, vp->da);
if (!value) goto oom;
- fr_value_box_copy(value, value, &vp->data);
+ if(unlikely(fr_value_box_copy(value, value, &vp->data) < 0)) {
+ talloc_free(value);
+ goto fail;
+ }
}
fr_value_box_list_insert_tail(&list, value);
value = fr_value_box_alloc(ctx, vp->data.type, vp->da);
if (!value) goto oom;
- fr_value_box_copy(value, value, &vp->data); /* Also dups taint */
+ if (unlikely(fr_value_box_copy(value, value, &vp->data) < 0)) goto fail;
fr_value_box_list_insert_tail(&list, value);
break;
}
if (tmpl_is_data(vpt)) {
MEM(value = fr_value_box_alloc(ctx, tmpl_value_type(vpt), NULL));
- fr_value_box_copy(value, value, tmpl_value(vpt)); /* Also dups taint */
+ if (unlikely(fr_value_box_copy(value, value, tmpl_value(vpt)) < 0)) {
+ talloc_free(value);
+ return -1; /* Also dups taint */
+ }
goto done;
}
if (steal) {
if (fr_value_box_steal(vpt, tmpl_value(vpt), data) < 0) goto error;
} else {
- if (fr_value_box_copy(vpt, tmpl_value(vpt), data) < 0) goto error;
+ if (unlikely(fr_value_box_copy(vpt, tmpl_value(vpt), data) < 0)) goto error;
}
*out = vpt;
if (dv) {
tmpl_init(vpt, TMPL_TYPE_DATA, T_BARE_WORD,
fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules);
- (void) fr_value_box_copy(vpt, &vpt->data.literal, dv->value);
+ if (unlikely(fr_value_box_copy(vpt, &vpt->data.literal, dv->value) < 0)) {
+ talloc_free(vpt);
+ return -1;
+ }
vpt->data.literal.enumv = t_rules->enumv;
*out = vpt;
data:
MEM(box = fr_value_box_alloc_null(state));
- if (fr_value_box_copy(box, box, tmpl_value(vpt)) < 0) return -1;
+ if (unlikely(fr_value_box_copy(box, box, tmpl_value(vpt)) < 0)) return -1;
fr_value_box_list_insert_tail(¤t->parent->rhs.list, box);
vp = tmpl_dcursor_init(NULL, request, &cc, &cursor, request, vpt);
while (vp) {
MEM(box = fr_value_box_alloc_null(state));
- if (fr_value_box_copy(box, box, &vp->data) < 0) return -1;
+ if (unlikely(fr_value_box_copy(box, box, &vp->data) < 0)) return -1;
fr_value_box_list_insert_tail(¤t->parent->rhs.list, box);
fr_pair_append(&to->vp_group, child);
if (fr_type_is_leaf(child->vp_type)) {
- if (fr_value_box_copy(child, &child->data, &vp->data) < 0) return -1;
+ if (unlikely(fr_value_box_copy(child, &child->data, &vp->data) < 0)) return -1;
continue;
}
if (fr_type_is_leaf(vp->vp_type)) {
if (vp->vp_type == state->value->vp_type) {
fr_value_box_clear_value(&vp->data);
- (void) fr_value_box_copy(vp, &vp->data, &state->value->data);
+ if (unlikely(fr_value_box_copy(vp, &vp->data, &state->value->data) < 0)) {
+ RPEDEBUG("Failed copying value from %s to %s", state->value->da->name, vp->da->name);
+ return UNLANG_ACTION_FAIL;
+ }
} else {
/*
* @todo - this shouldn't happen?
.unlang_size = sizeof(unlang_group_t),
.unlang_name = "unlang_group_t",
- });
+ });
unlang_register(&(unlang_op_t){
.name = "continue",
* because references aren't threadsafe.
*/
MEM(value = fr_value_box_alloc_null(ctx));
- if (fr_value_box_copy(value, value, &node->data) < 0) goto fail;
+ if (unlikely(fr_value_box_copy(value, value, &node->data) < 0)) goto fail;
fr_dcursor_append(out, value);
continue;
MEM(value = fr_value_box_alloc(ctx, tmpl_value_type(node->vpt), NULL));
- fr_value_box_copy(value, value, tmpl_value(node->vpt)); /* Also dups taint */
+ if (unlikely(fr_value_box_copy(value, value, tmpl_value(node->vpt)) < 0)) {
+ talloc_free(value);
+ goto fail;
+ }; /* Also dups taint */
fr_value_box_list_insert_tail(&result, value);
/*
xlat_instance_unregister_func(parent);
xlat_exp_set_type(parent, XLAT_BOX);
- fr_value_box_copy(parent, &parent->data, box);
+ if (!fr_cond_assert(fr_value_box_copy(parent, &parent->data, box) == 0)) return false;
return true;
}
} else {
fr_value_box_clear(rctx->box);
}
- if (last) fr_value_box_copy(rctx->box, rctx->box, last);
+ if (last && !fr_cond_assert(fr_value_box_copy(rctx->box, rctx->box, last) == 0)) return false;
return ret;
}
} else {
fr_value_box_clear(rctx->box);
}
- fr_value_box_copy(rctx->box, rctx->box, found);
+ if (!fr_cond_assert(fr_value_box_copy(rctx->box, rctx->box, found) == 0)) return false;
return true;
}
#include <freeradius-devel/unlang/xlat_priv.h>
#include <freeradius-devel/util/calc.h>
-static void xlat_value_list_to_xlat(xlat_exp_head_t *head, fr_value_box_list_t *list)
+static int xlat_value_list_to_xlat(xlat_exp_head_t *head, fr_value_box_list_t *list)
{
fr_value_box_t *box;
xlat_exp_t *node;
while ((box = fr_value_box_list_pop_head(list)) != NULL) {
MEM(node = xlat_exp_alloc(head, XLAT_BOX, NULL, 0));
- fr_value_box_copy(node, &node->data, box);
+ if (unlikely(fr_value_box_copy(node, &node->data, box) < 0)) {
+ talloc_free(node);
+ return -1;
+ }
if (node->data.type == FR_TYPE_STRING) {
node->quote = T_DOUBLE_QUOTED_STRING;
xlat_exp_insert_tail(head, node);
}
+
+ return 0;
}
static int xlat_purify_list_internal(xlat_exp_head_t *head, request_t *request, fr_token_t quote);
xlat_instance_unregister_func(node);
xlat_exp_set_type(node, XLAT_GROUP); /* Frees the argument list */
- xlat_value_list_to_xlat(node->group, &list);
+ if (xlat_value_list_to_xlat(node->group, &list) < 0) return -1;
node->flags = node->group->flags;
break;
}
MEM(fr_value_box_aprint(node, &name, &box, NULL) >= 0);
xlat_exp_set_name_shallow(node, name);
- fr_value_box_copy(node, &node->data, &box);
+ if (unlikely(fr_value_box_copy(node, &node->data, &box) < 0)) {
+ talloc_free(node);
+ return -1;
+ }
*out = node;
case FR_TYPE_IPV4_PREFIX:
case FR_TYPE_IPV4_ADDR:
- fr_value_box_copy(NULL, out, in);
+ if (unlikely(fr_value_box_copy(NULL, out, in) < 0)) return -1;
break;
case FR_TYPE_IPV6_ADDR:
case FR_TYPE_IPV6_PREFIX:
case FR_TYPE_IPV6_ADDR:
- fr_value_box_copy(NULL, out, in);
+ if (unlikely(fr_value_box_copy(NULL, out, in) < 0)) return -1;
break;
case FR_TYPE_IPV4_ADDR:
return -1;
}
} else {
- if (fr_value_box_copy(enum_value, enum_value, value) < 0) {
+ if (unlikely(fr_value_box_copy(enum_value, enum_value, value) < 0)) {
fr_strerror_printf_push("%s: Failed copying value into enum", __FUNCTION__);
return -1;
}
case FR_EDIT_VALUE:
fr_assert(fr_type_is_leaf(vp->vp_type));
if (!fr_type_is_fixed_size(vp->vp_type)) fr_value_box_clear(&vp->data);
- fr_value_box_copy(vp, &vp->data, &e->data);
+ if (unlikely(fr_value_box_copy(vp, &vp->data, &e->data) < 0)) return -1;
break;
case FR_EDIT_CLEAR:
fr_assert(ref == NULL);
fr_assert(fr_type_is_leaf(vp->vp_type));
- fr_value_box_copy(e, &e->data, &vp->data);
+ if (unlikely(fr_value_box_copy(e, &e->data, &vp->data) < 0)) goto fail;
break;
case FR_EDIT_CLEAR:
*/
if (fr_type_is_structural(n->vp_type)) {
if (fr_pair_list_copy(n, &n->vp_group, &vp->vp_group) < 0) {
+ error:
talloc_free(n);
return NULL;
}
} else {
- fr_value_box_copy(n, &n->data, &vp->data);
+ if (unlikely(fr_value_box_copy(n, &n->data, &vp->data) < 0)) goto error;
}
return n;
fr_value_box_list_talloc_free_to_tail(&dst->vb_group, first_added);
return -1;
}
- fr_value_box_copy(value, value, &vp->data);
+ if (unlikely(fr_value_box_copy(value, value, &vp->data) < 0)) {
+ talloc_free(value);
+ goto fail;
+ }
}
if (!first_added) first_added = value;
if (!fr_cond_assert(src->data.type != FR_TYPE_NULL)) return -1;
fr_value_box_clear_value(&dst->data);
- fr_value_box_copy(dst, &dst->data, &src->data);
+ if (unlikely(fr_value_box_copy(dst, &dst->data, &src->data) < 0)) return -1;
/*
* If either source or destination is secret, then this value is secret.
case FR_TYPE_IFID:
case FR_TYPE_ETHERNET:
case FR_TYPE_SIZE:
- fr_value_box_copy(NULL, dst, src);
+ if (unlikely(fr_value_box_copy(NULL, dst, src) < 0)) return -1;
return 0;
case FR_TYPE_NULL:
{
switch (src->type) {
default:
- fr_value_box_copy(NULL, dst, src);
+ if (unlikely(fr_value_box_copy(NULL, dst, src) < 0)) return;
break;
case FR_TYPE_STRING:
CC_HINT(nonnull(1));
int fr_value_box_copy(TALLOC_CTX *ctx, fr_value_box_t *dst, const fr_value_box_t *src)
- CC_HINT(nonnull(2,3));
+ CC_HINT(nonnull(2,3)) CC_HINT(warn_unused_result);
void fr_value_box_copy_shallow(TALLOC_CTX *ctx, fr_value_box_t *dst,
const fr_value_box_t *src)
(tmpl_list(map->lhs) != tmpl_list(target))) continue;
MEM(vb = fr_value_box_alloc_null(ctx));
- fr_value_box_copy(vb, vb, tmpl_value(map->rhs));
+ if (unlikely(fr_value_box_copy(vb, vb, tmpl_value(map->rhs)) < 0)) {
+ RPEDEBUG("Failed copying value from cache entry");
+ talloc_free(vb);
+ return XLAT_ACTION_FAIL;
+ }
fr_dcursor_append(out, vb);
break;
}
*/
slen = tmpl_aexpand_type(request, &key, FR_TYPE_VALUE_BOX, request, inst->key);
if (slen < 0) {
- DEBUG("Failed expanding key '%s'", inst->key->name);
+ REDEBUG("Failed expanding key '%s'", inst->key->name);
RETURN_UNLANG_FAIL;
}
if (key->type != inst->key_data_type) {
fr_value_box_t tmp;
- fr_value_box_copy(request, &tmp, key);
+ if (unlikely(fr_value_box_copy(request, &tmp, key) < 0)) {
+ talloc_free(key);
+ REDEBUG("Failed copying %pV to data type '%s'",
+ &key, fr_type_to_str(inst->key_data_type));
+ RETURN_UNLANG_FAIL;
+ }
slen = fr_value_box_cast(request, key, inst->key_data_type, NULL, &tmp);
fr_value_box_clear(&tmp);
if (slen < 0) {
talloc_free(key);
- DEBUG("Failed casting %pV to data type '%s'",
- &key, fr_type_to_str(inst->key_data_type));
+ REDEBUG("Failed casting %pV to data type '%s'",
+ &key, fr_type_to_str(inst->key_data_type));
RETURN_UNLANG_FAIL;
}
}
user_list->name = entry->name;
user_list->box = fr_value_box_alloc(user_list, data_type, NULL);
- (void) fr_value_box_copy(user_list, user_list->box, box);
+ if (unlikely(fr_value_box_copy(user_list, user_list->box, box) < 0)) {
+ PERROR("%s[%d] Failed copying key %s",
+ entry->filename, entry->lineno, entry->name);
+ }
/*
* Insert the new list header.
*/
if (!fr_htrie_insert(tree, user_list)) {
- ERROR("%s[%d] Failed inserting key %s - %s",
- entry->filename, entry->lineno, entry->name, fr_strerror());
+ PERROR("%s[%d] Failed inserting key %s",
+ entry->filename, entry->lineno, entry->name);
goto error;
error:
static int add_option_by_da(rlm_isc_dhcp_info_t *info, fr_dict_attr_t const *da)
{
- int ret;
fr_pair_t *vp;
if (!info->parent) return -1; /* internal error */
MEM(vp = fr_pair_afrom_da(info->parent, da));
- ret = fr_value_box_copy(vp, &(vp->data), info->argv[0]);
- if (ret < 0) return ret;
+ /* TLS error buffer is checked */
+ if (unlikely(fr_value_box_copy(vp, &(vp->data), info->argv[0]) < 0)) {
+ talloc_free(vp);
+ return -1;
+ }
fr_pair_append(&info->parent->options, vp);
*/
static int apply_fixed_ip(rlm_isc_dhcp_t const *inst, request_t *request)
{
- int ret;
rlm_isc_dhcp_info_t *host, *info;
fr_pair_t *vp;
fr_pair_t *yiaddr;
MEM(vp = fr_pair_afrom_da(request->reply_ctx, attr_your_ip_address));
- ret = fr_value_box_copy(vp, &(vp->data), info->argv[0]);
- if (ret < 0) return ret;
-
+ if (unlikely(fr_value_box_copy(vp, &(vp->data), info->argv[0]) < 0)) {
+ RPEDEBUG("Failed assigning Your-IP-Address");
+ return -1;
+ }
fr_pair_append(&request->reply_pairs, vp);
/*
* If it's already safe, just copy it over.
*/
if (fr_value_box_is_safe_for_only(in_vb, LDAP_URI_SAFE_FOR)) {
- fr_value_box_copy(vb, vb, in_vb);
+ if (unlikely(fr_value_box_copy(vb, vb, in_vb) < 0)) {
+ RPEDEBUG("Failed copying input argument to output");
+ talloc_free(vb);
+ return XLAT_ACTION_FAIL;
+ }
fr_dcursor_append(out, vb);
return XLAT_ACTION_DONE;
.rhs = &ip_rhs
};
- fr_value_box_copy(NULL, &ip_rhs.data.literal, &env->requested_address);
+ if (unlikely(fr_value_box_copy(NULL, &ip_rhs.data.literal, &env->requested_address) < 0)) {
+ RPEDEBUG("Failed copying IP address to reply attribute");
+ RETURN_UNLANG_FAIL;
+ }
if (map_to_request(request, &ip_map, map_to_vp, NULL) < 0) RETURN_UNLANG_FAIL;
}
fr_value_box_list_foreach(in, vb_p) {
MEM(vb = fr_value_box_alloc(ctx, FR_TYPE_STRING, NULL));
- if (fr_value_box_copy(vb, vb, vb_p) < 0) {
+ if (unlikely(fr_value_box_copy(vb, vb, vb_p) < 0)) {
talloc_free(vb);
return XLAT_ACTION_FAIL;
}
* Don't override the user status
* code.
*/
- if (pair_update_reply(&vp, attr_status_code_value) == 0) fr_value_box_copy(vp, &vp->data, vb);
+ if (pair_update_reply(&vp, attr_status_code_value) == 0) {
+ if (unlikely(fr_value_box_copy(vp, &vp->data, vb) < 0)) {
+ RPERROR("Failed copying status code value");
+ pair_delete_reply(vp);
+ return;
+ }
+ }
/*
* Move the module failure messages upwards
*/
MEM((ret = fr_pair_update_by_da_parent(request->reply_ctx, rcode, attr_rcode)) >= 0);
if (ret == 0) {
- fr_value_box_copy(*rcode, &(*rcode)->data, vb);
+ if (unlikely(fr_value_box_copy(*rcode, &(*rcode)->data, vb) < 0)) {
+ RPEDEBUG("Failed copying rcode value");
+ return;
+ }
(*rcode)->data.enumv = (*rcode)->da; /* Hack, boxes should have their enumv field populated */
}
}
fr_pair_t *vp;
MEM(vp = fr_pair_afrom_da(request->reply_ctx, attr_proxy_state));
- fr_value_box_copy(vp, &vp->data, proxy_state_value);
+ if (unlikely(fr_value_box_copy(vp, &vp->data, proxy_state_value) < 0)) {
+ RDEBUG2("Failed to copy Proxy-State value %pV", proxy_state_value);
+ talloc_free(vp);
+ break;
+ }
fr_pair_append(&request->reply_pairs, vp);
RDEBUG3("reply.%pP", vp);
}
*/
add_auth_flags:
MEM(pair_append_reply(&vp, attr_tacacs_authentication_flags) >= 0);
- (void) fr_value_box_copy(vp, &vp->data, enum_auth_flags_noecho);
+ if (unlikely(fr_value_box_copy(vp, &vp->data, enum_auth_flags_noecho) < 0)) {
+ RPEDEBUG("Failed creating Authentication-Flags attribute with No-Echo flag");
+ pair_delete_reply(vp);
+ goto reject;
+ }
vp->data.enumv = attr_tacacs_authentication_flags;
goto send_reply;
}
return -1;
}
- if (fr_value_box_copy(vp, &vp->data, flags->default_value) < 0) {
+ if (unlikely(fr_value_box_copy(vp, &vp->data, flags->default_value) < 0)) {
talloc_free(vp);
return -1;
}