if (fr_value_box_from_str(NULL, &box, FR_TYPE_BOOL, NULL,
info->argv[0], strlen(info->argv[0]),
- NULL, false) <= 0) {
+ NULL) <= 0) {
fprintf(fp_err, "Failed setting profile status '%s' - %s\n", info->argv[0], fr_strerror());
return -1;
}
sbuff = FR_SBUFF_IN(p, strlen(p));
slen = fr_value_box_from_substr(box, box, FR_TYPE_STRING, NULL,
&sbuff,
- &value_parse_rules_double_quoted,
- false);
+ &value_parse_rules_double_quoted);
if (slen < 0) {
RETURN_OK_WITH_ERROR();
}
slen = fr_value_box_from_substr(box, box, type, NULL,
&sbuff,
- &value_parse_rules_bareword_unquoted,
- false);
+ &value_parse_rules_bareword_unquoted);
if (slen < 0) {
RETURN_OK_WITH_ERROR();
}
if (fr_value_box_from_str(box, box, FR_TYPE_STRING, NULL,
p, strlen(p),
- &fr_value_unescape_double,
- false) < 0) {
+ &fr_value_unescape_double) < 0) {
talloc_free(box);
RETURN_OK_WITH_ERROR();
}
box2 = talloc_zero(NULL, fr_value_box_t);
if (fr_value_box_from_str(box2, box2, type, NULL,
data, slen,
- &fr_value_unescape_double, false) < 0) {
+ &fr_value_unescape_double) < 0) {
talloc_free(box2);
talloc_free(box);
RETURN_OK_WITH_ERROR();
case LDAP_FILTER_OP_BIT_AND:
case LDAP_FILTER_OP_BIT_OR:
if (fr_value_box_from_str(node, node->value, FR_TYPE_UINT32, NULL,
- val_buffer, len, NULL, false) < 0) {
+ val_buffer, len, NULL) < 0) {
fr_strerror_const("Failed parsing value for filter");
FR_SBUFF_ERROR_RETURN(sbuff);
}
*/
int cf_pair_to_value_box(TALLOC_CTX *ctx, fr_value_box_t *out, CONF_PAIR *cp, conf_parser_t const *rule)
{
- if (fr_value_box_from_str(ctx, out, rule->type, NULL, cp->value, talloc_array_length(cp->value) - 1, NULL, false) < 0) {
+ if (fr_value_box_from_str(ctx, out, rule->type, NULL, cp->value, talloc_array_length(cp->value) - 1, NULL) < 0) {
cf_log_perr(cp, "Invalid value \"%s\" for config item %s",
cp->value, cp->attr);
if (fr_rule_file_exists(rule) && !cf_file_check(cp, false)) goto error;
}
+ fr_value_box_mark_safe_for(out, FR_VALUE_BOX_SAFE_FOR_ANY);
+
return 0;
}
if (fr_value_box_from_str(ctx, box, type,
NULL,
name, strlen(name),
- fr_value_unescape_by_char[(uint8_t)quote], true) < 0) {
+ fr_value_unescape_by_char[(uint8_t)quote]) < 0) {
fr_strerror_printf_push("Failed parsing argument '%s'", name);
return -1;
}
ret = fr_value_box_from_str(info->box[argc], info->box[argc],
type, NULL,
word + offset, len - (offset << 1),
- fr_value_unescape_by_char[(uint8_t)quote], false);
+ fr_value_unescape_by_char[(uint8_t)quote]);
if (ret < 0) return -1;
/*
ret = fr_value_box_from_str(info->box[info->argc], info->box[info->argc],
type, NULL,
word + offset, len - (offset << 1),
- fr_value_unescape_by_char[(uint8_t)quote], false);
+ fr_value_unescape_by_char[(uint8_t)quote]);
if (ret < 0) return -1;
info->argc++;
*word_p = word = p;
fr_value_box_init(&box, FR_TYPE_BOOL, NULL, false);
if (fr_value_box_from_str(NULL, &box, FR_TYPE_BOOL, NULL,
- p, strlen(p), NULL, false) < 0) {
+ p, strlen(p), NULL) < 0) {
fr_perror("Invalid boolean \"%s\"", p);
fr_exit(1);
}
* It MUST be the given data type, and it MAY be an enum name.
*/
slen = fr_value_box_from_substr(map, vb, rhs_rules->enumv->type, rhs_rules->enumv,
- &our_in, p_rules, false);
+ &our_in, p_rules);
if (slen < 0) goto error;
if (tmpl_afrom_value_box(map, &map->rhs, vb, true) < 0) {
* It MUST be the given data type.
*/
slen = fr_value_box_from_str(map, vb, my_rules.enumv->type, my_rules.enumv,
- rhs, strlen(rhs), NULL, false);
+ rhs, strlen(rhs), NULL);
if (slen <= 0) goto error;
if (tmpl_afrom_value_box(map, &map->rhs, vb, true) < 0) {
tmpl_value(map_list_head(&n->mod)->rhs), type,
tmpl_attr_tail_da(mutated->lhs),
mutated->rhs->name, mutated->rhs->len,
- fr_value_unescape_by_quote[(uint8_t)mutated->rhs->quote], false)) {
+ fr_value_unescape_by_quote[(uint8_t)mutated->rhs->quote])) {
RPEDEBUG("Assigning value to \"%s\" failed", tmpl_attr_tail_da(mutated->lhs)->name);
goto error;
}
*/
ret = fr_value_box_from_str(tmp_ctx, &tmp, src_type, NULL,
result, (size_t)slen,
- NULL, false);
+ NULL);
if (ret < 0) goto error;
fr_value_box_bstrndup_shallow(&value, NULL, tmp.vb_strvalue, tmp.vb_length, tmp.tainted);
*/
ret = fr_value_box_from_str(tmp_ctx, &tmp, src_type, NULL,
result, (size_t)slen,
- NULL, false);
+ NULL);
if (ret < 0) goto error;
fr_value_box_bstrndup_shallow(&value, NULL, tmp.vb_strvalue, tmp.vb_length, tmp.tainted);
vpt = tmpl_alloc_null(ctx);
if (fr_value_box_from_substr(vpt, &tmp,
cast, allow_enum ? t_rules->enumv : NULL,
- &our_in, p_rules, false) < 0) {
+ &our_in, p_rules) < 0) {
talloc_free(vpt);
FR_SBUFF_ERROR_RETURN(&our_in);
}
MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_DATA, T_BARE_WORD, fr_sbuff_start(&our_in), fr_sbuff_used(&our_in)));
if (fr_value_box_from_substr(vpt, &vpt->data.literal, type, NULL,
&FR_SBUFF_REPARSE(&our_in),
- NULL, false) < 0) {
+ NULL) < 0) {
talloc_free(vpt);
goto error;
}
MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_DATA, T_BARE_WORD, fr_sbuff_start(&our_in), fr_sbuff_used(&our_in)));
if (fr_value_box_from_substr(vpt, &vpt->data.literal, type, NULL,
&FR_SBUFF_REPARSE(&our_in),
- NULL, false) < 0) {
+ NULL) < 0) {
talloc_free(vpt);
goto error;
}
if (fr_value_box_from_str(vpt, &vpt->data.literal, type,
enumv,
unescaped, talloc_array_length(unescaped) - 1,
- NULL, false) < 0) return -1;
+ NULL) < 0) return -1;
}
vpt->type = TMPL_TYPE_DATA;
vpt->quote = tmpl_cast_quote(vpt->quote, type, enumv,
/*
* @todo - unescape for double quoted strings. Whoops.
*/
- slen = fr_value_box_from_str(NULL, &box, da->type, da, value, len, NULL, false);
+ slen = fr_value_box_from_str(NULL, &box, da->type, da, value, len, NULL);
if (slen < 0) {
cf_log_err(cp, "Failed parsing value - %s", fr_strerror());
return -1;
erules = fr_value_unescape_by_quote[current->map->lhs->quote];
- if (fr_value_box_from_str(dst, dst, da->type, da, box->vb_strvalue, box->vb_length, erules, box->tainted) < 0) {
+ if (fr_value_box_from_str(dst, dst, da->type, da, box->vb_strvalue, box->vb_length, erules) < 0) {
RWDEBUG("Failed converting result to '%s' - %s", fr_type_to_str(type), fr_strerror());
return -1;
}
+ fr_value_box_safety_copy_changed(dst, box);
fr_value_box_list_talloc_free(¤t->lhs.result);
fr_value_box_list_insert_tail(¤t->parent->rhs.result, dst);
if (fr_value_box_from_str(state->ctx, box, type, NULL,
fr_sbuff_start(&state->exec.stdout_buff),
fr_sbuff_used(&state->exec.stdout_buff),
- NULL, true) < 0) {
+ NULL) < 0) {
talloc_free(box);
*p_result = RLM_MODULE_FAIL;
return UNLANG_ACTION_CALCULATE_RESULT;
if (fr_value_box_from_str(fixup, &value, type, NULL,
fixup->value, talloc_array_length(fixup->value) - 1,
- NULL, false) < 0) {
+ NULL) < 0) {
fr_strerror_printf_push("Invalid VALUE '%pV' for attribute '%s' at %s[%d]",
fr_box_strvalue_buffer(fixup->value),
da->name,
/*
* Parse the value.
*/
- if (fr_value_box_from_str(NULL, &value, parent->type, NULL, argv[2], strlen(argv[2]), NULL, false) < 0) {
+ if (fr_value_box_from_str(NULL, &value, parent->type, NULL, argv[2], strlen(argv[2]), NULL) < 0) {
fr_strerror_printf_push("Invalid value for STRUCT \"%s\"", argv[2]);
return -1;
}
if (fr_value_box_from_str(NULL, &value, da->type, NULL,
argv[2], strlen(argv[2]),
- NULL, false) < 0) {
+ NULL) < 0) {
fr_strerror_printf_push("Invalid VALUE '%s' for attribute '%s' of data type '%s'",
argv[2],
da->name,
box = fr_value_box_alloc(ctx, type, NULL);
if (!box) return -1;
- rcode = fr_value_box_from_str(box, box, type, NULL, (char const *)data + 1, data_len - 1, NULL, true);
+ rcode = fr_value_box_from_str(box, box, type, NULL, (char const *)data + 1, data_len - 1, NULL);
talloc_free(box);
return rcode;
}
* - -1 on failure.
*/
int fr_pair_value_from_str(fr_pair_t *vp, char const *value, size_t inlen,
- fr_sbuff_unescape_rules_t const *uerules, bool tainted)
+ fr_sbuff_unescape_rules_t const *uerules, UNUSED bool tainted)
{
/*
* This is not yet supported because the rest of the APIs
*/
if (fr_value_box_from_str(vp, &vp->data, vp->vp_type, vp->da,
value, inlen,
- uerules,
- tainted) < 0) return -1;
+ uerules) < 0) return -1;
fr_assert(vp->data.safe_for == FR_VALUE_BOX_SAFE_FOR_NONE);
};
-static ssize_t fr_pair_value_from_substr(fr_pair_t *vp, fr_sbuff_t *in, bool tainted)
+static ssize_t fr_pair_value_from_substr(fr_pair_t *vp, fr_sbuff_t *in, UNUSED bool tainted)
{
char quote;
ssize_t slen;
quote = '\0';
}
- slen = fr_value_box_from_substr(vp, &vp->data, vp->da->type, vp->da, in, rules, tainted);
+ slen = fr_value_box_from_substr(vp, &vp->data, vp->da->type, vp->da, in, rules);
if (slen < 0) {
fr_assert(slen >= -((ssize_t) 1 << 20));
return slen - (quote != 0);
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
CAST_IP_FIX_COMBO;
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
CAST_IP_FIX_COMBO;
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
CAST_IP_FIX_COMBO;
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
CAST_IP_FIX_COMBO;
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
case FR_TYPE_OCTETS:
return fr_value_box_fixed_size_from_octets(dst, dst_type, dst_enumv, src);
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
case FR_TYPE_OCTETS:
/*
case FR_TYPE_STRING:
return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
case FR_TYPE_OCTETS:
return fr_value_box_fixed_size_from_octets(dst, dst_type, dst_enumv, src);
*/
if (src->type == FR_TYPE_STRING) return fr_value_box_from_str(ctx, dst, dst_type, dst_enumv,
src->vb_strvalue, src->vb_length,
- NULL, src->tainted);
+ NULL);
if (src->type == FR_TYPE_OCTETS) {
fr_value_box_t tmp;
* @param[in] dst_enumv fr_dict_attr_t with string names for uint32 values.
* @param[in] in sbuff to read data from.
* @param[in] rules unescape and termination rules.
- * @param[in] tainted Whether the value came from a trusted source.
* @return
* - >0 on success.
* - <= 0 on parse error.
*/
ssize_t fr_value_box_from_substr(TALLOC_CTX *ctx, fr_value_box_t *dst,
fr_type_t dst_type, fr_dict_attr_t const *dst_enumv,
- fr_sbuff_t *in, fr_sbuff_parse_rules_t const *rules, bool tainted)
+ fr_sbuff_t *in, fr_sbuff_parse_rules_t const *rules)
{
static fr_sbuff_parse_rules_t default_rules;
fr_sbuff_t *unescaped = NULL;
rules->terminals, rules->escapes) < 0)) {
return -1;
}
- fr_value_box_bstrdup_buffer_shallow(NULL, dst, dst_enumv, buff, tainted);
+ fr_value_box_bstrdup_buffer_shallow(NULL, dst, dst_enumv, buff, false);
/*
* We already have an unescaped version, just use that
*/
} else {
fr_value_box_bstrndup(ctx, dst, dst_enumv,
- fr_sbuff_start(unescaped), fr_sbuff_used(unescaped), tainted);
+ fr_sbuff_start(unescaped), fr_sbuff_used(unescaped), false);
}
FR_SBUFF_SET_RETURN(in, &our_in);
bin = talloc_zero_array(ctx, uint8_t, 0);
}
- fr_value_box_memdup_buffer_shallow(NULL, dst, dst_enumv, bin, tainted);
+ fr_value_box_memdup_buffer_shallow(NULL, dst, dst_enumv, bin, false);
/*
* We already have an unescaped version, just use that
*/
} else {
fr_value_box_memdup(ctx, dst, dst_enumv,
(uint8_t *)fr_sbuff_start(unescaped),
- fr_sbuff_used(unescaped), tainted);
+ fr_sbuff_used(unescaped), false);
}
FR_SBUFF_SET_RETURN(in, &our_in);
}
*/
hex_len = fr_sbuff_adv_past_allowed(&our_in, SIZE_MAX, sbuff_char_class_hex, rules->terminals);
if (hex_len == 0) {
- if (fr_value_box_memdup(ctx, dst, dst_enumv, (uint8_t[]){ 0x00 }, 0, tainted) < 0) return -1;
+ if (fr_value_box_memdup(ctx, dst, dst_enumv, (uint8_t[]){ 0x00 }, 0, false) < 0) return -1;
FR_SBUFF_SET_RETURN(in, &our_in);
}
/*
* Pre-allocate the bin buff and initialise the box
*/
- if (fr_value_box_mem_alloc(ctx, &bin_buff, dst, dst_enumv, (hex_len >> 1), tainted) < 0) return -1;
+ if (fr_value_box_mem_alloc(ctx, &bin_buff, dst, dst_enumv, (hex_len >> 1), false) < 0) return -1;
/*
* Reset to the start of the hex string
case FR_TYPE_INT64:
case FR_TYPE_FLOAT32:
case FR_TYPE_FLOAT64:
- return fr_value_box_from_numeric_substr(dst, dst_type, dst_enumv, in, rules, tainted);
+ return fr_value_box_from_numeric_substr(dst, dst_type, dst_enumv, in, rules, false);
case FR_TYPE_SIZE:
if (fr_size_from_str(&dst->datum.size, &our_in) < 0) return -1;
goto finish;
case FR_TYPE_BOOL:
- fr_value_box_init(dst, dst_type, dst_enumv, tainted);
+ fr_value_box_init(dst, dst_type, dst_enumv, false);
/*
* Quoted boolean values are "yes", "no", "true", "false"
num = htonll(num);
FR_DBUFF_IN_MEMCPY_RETURN(&dbuff, ((uint8_t *) &num) + 2, sizeof(dst->vb_ether));
- fr_value_box_ethernet_addr(dst, dst_enumv, ðer, tainted);
+ fr_value_box_ethernet_addr(dst, dst_enumv, ðer, false);
FR_SBUFF_SET_RETURN(in, &our_in);
}
fr_base16_decode(&err, &dbuff, &our_in, true);
if (err != FR_SBUFF_PARSE_OK) goto ether_error;
- fr_value_box_ethernet_addr(dst, dst_enumv, (fr_ethernet_t * const)fr_dbuff_start(&dbuff), tainted);
+ fr_value_box_ethernet_addr(dst, dst_enumv, (fr_ethernet_t * const)fr_dbuff_start(&dbuff), false);
FR_SBUFF_SET_RETURN(in, &our_in);
}
case FR_TYPE_TIME_DELTA:
- fr_value_box_init(dst, FR_TYPE_TIME_DELTA, dst_enumv, tainted);
+ fr_value_box_init(dst, FR_TYPE_TIME_DELTA, dst_enumv, false);
slen = fr_time_delta_from_substr(&dst->datum.time_delta, &our_in,
dst_enumv ? dst_enumv->flags.flag_time_res : FR_TIME_RES_SEC,
case FR_TYPE_NULL:
if (!rules->escapes && fr_sbuff_adv_past_str_literal(&our_in, "NULL")) {
- fr_value_box_init(dst, dst_type, dst_enumv, tainted);
+ fr_value_box_init(dst, dst_type, dst_enumv, false);
FR_SBUFF_SET_RETURN(in, &our_in);
}
finish:
dst->type = dst_type;
- dst->tainted = tainted;
+ dst->tainted = false;
+ fr_value_box_mark_unsafe(dst);
/*
* Fixup enumvs
ssize_t fr_value_box_from_str(TALLOC_CTX *ctx, fr_value_box_t *dst,
fr_type_t dst_type, fr_dict_attr_t const *dst_enumv,
char const *in, size_t inlen,
- fr_sbuff_unescape_rules_t const *erules, bool tainted)
+ fr_sbuff_unescape_rules_t const *erules)
{
ssize_t slen;
fr_sbuff_parse_rules_t prules = { .escapes = erules };
- slen = fr_value_box_from_substr(ctx, dst, dst_type, dst_enumv, &FR_SBUFF_IN(in, inlen), &prules, tainted);
+ slen = fr_value_box_from_substr(ctx, dst, dst_type, dst_enumv, &FR_SBUFF_IN(in, inlen), &prules);
if (slen <= 0) return slen;
if (slen != (ssize_t)inlen) {
*/
ssize_t fr_value_box_from_substr(TALLOC_CTX *ctx, fr_value_box_t *dst,
fr_type_t dst_type, fr_dict_attr_t const *dst_enumv,
- fr_sbuff_t *in, fr_sbuff_parse_rules_t const *rules, bool tainted)
+ fr_sbuff_t *in, fr_sbuff_parse_rules_t const *rules)
CC_HINT(nonnull(2,5));
ssize_t fr_value_box_from_str(TALLOC_CTX *ctx, fr_value_box_t *dst,
fr_type_t dst_type, fr_dict_attr_t const *dst_enumv,
char const *in, size_t inlen,
- fr_sbuff_unescape_rules_t const *erules, bool tainted)
+ fr_sbuff_unescape_rules_t const *erules)
CC_HINT(nonnull(2,5));
/** @} */
if (pair_append_by_tmpl_parent(sync_packet_ctx, &vp, pairs, map->lhs, true) < 0) break;
if (fr_value_box_from_str(vp, &vp->data, vp->vp_type, NULL, values[i]->bv_val,
- values[i]->bv_len, NULL, true) < 0) {
+ values[i]->bv_len, NULL) < 0) {
fr_pair_remove(pairs, vp);
talloc_free(vp);
}
e->key = fr_value_box_alloc_null(e);
if (!e->key) goto fail;
- if (fr_value_box_from_str(e->key, e->key, type, NULL, p, strlen(p), NULL, false) < 0) {
+ if (fr_value_box_from_str(e->key, e->key, type, NULL, p, strlen(p), NULL) < 0) {
cf_log_err(conf, "Failed parsing key field in file %s line %d - %s", inst->filename, lineno,
fr_strerror());
fail:
if (!e->key) goto fail;
if (fr_value_box_from_str(e->key, e->key, type, NULL,
- p, strlen(p), NULL, false) < 0) {
+ p, strlen(p), NULL) < 0) {
cf_log_err(conf, "Failed parsing key field in file %s line %d - %s", inst->filename, lineno,
fr_strerror());
fail:
fr_type_t type = inst->field_types[i];
if (fr_value_box_from_str(e, &box, type, NULL,
- p, strlen(p), NULL, false) < 0) {
+ p, strlen(p), NULL) < 0) {
cf_log_err(conf, "Failed parsing field '%s' in file %s line %d - %s", inst->field_names[i],
inst->filename, lineno, fr_strerror());
goto fail;
* Has to be of the correct data type.
*/
if (fr_value_box_from_str(box, box, data_type, key_enum,
- entry->name, strlen(entry->name), NULL, false) < 0) {
+ entry->name, strlen(entry->name), NULL) < 0) {
ERROR("%s[%d] Failed parsing key %s - %s",
entry->filename, entry->lineno, entry->name, fr_strerror());
goto error;
info->argv[info->argc] = talloc_zero(info, fr_value_box_t);
ret = fr_value_box_from_str(info, info->argv[info->argc], type, NULL,
- state->token, state->token_len, NULL, false);
+ state->token, state->token_len, NULL);
if (ret < 0) return ret;
info->argc++;
type = FR_TYPE_UINT32;
ret = fr_value_box_from_str(NULL, &box, type, NULL,
- state->token, state->token_len, NULL, false);
+ state->token, state->token_len, NULL);
if (ret < 0) goto error;
/*
if (!flags->default_value) return -1;
if (fr_value_box_from_str(flags->default_value, flags->default_value, (*da_p)->type, NULL,
- value, strlen(value), NULL, false) < 0) {
+ value, strlen(value), NULL) < 0) {
fr_strerror_printf("Failed parsing 'value=...' - %s", fr_strerror());
return -1;
}