while (fr_sbuff_is_char(sbuff, '(')) {
if (node->logic_op == LDAP_FILTER_LOGIC_NOT) {
fr_strerror_const("'!' operator can only apply to one filter");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
MEM(child_node = talloc_zero(node, ldap_filter_t));
fr_dlist_insert_tail(&node->children, child_node);
len = fr_sbuff_out_bstrncpy_allowed(&attr_sbuff, sbuff, FILTER_ATTR_MAX_LEN - 1, fr_ldap_attr_allowed_chars);
if (len == 0) {
fr_strerror_const("Missing attribute name");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
MEM(node->attr = talloc_zero_array(node, char, len+1));
}
fr_strerror_const("Unsupported extended match rule");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
found_op:
if(!(fr_sbuff_next_if_char(sbuff, ':'))) {
fr_strerror_const("Missing ':' after extended match rule");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
}
default:
fr_strerror_const("Incorrect operator");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
if (((node->op == LDAP_FILTER_OP_BIT_AND) || (node->op == LDAP_FILTER_OP_BIT_OR)) &&
(op != LDAP_FILTER_OP_EQ)) {
fr_strerror_const("Extended match rule only valid with '=' operator");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
/*
if (len == 0) {
fr_strerror_const("Missing filter value");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
/*
case LDAP_FILTER_OP_SUBSTR:
if (fr_value_box_bstrndup(node, node->value, NULL, val_buffer, len, false) < 0) {
fr_strerror_const("Failed parsing value for filter");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
break;
if (fr_value_box_from_str(node, node->value, FR_TYPE_UINT32, NULL,
val_buffer, len, NULL, false) < 0) {
fr_strerror_const("Failed parsing value for filter");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
break;
if (!fr_sbuff_next_if_char(sbuff, '(')) {
fr_strerror_const("Missing '('");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
/*
if (!fr_sbuff_next_if_char(sbuff, ')')) {
fr_strerror_const("Missing ')'");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
parsed ++;
*/
if ((depth == 0) && (fr_sbuff_extend(sbuff))) {
fr_strerror_const("Extra characters at the end of LDAP filter");
- return fr_sbuff_error(sbuff);
+ FR_SBUFF_ERROR_RETURN(sbuff);
}
return parsed;
/*
* Parse (optional) cast
*/
- if (tmpl_cast_from_substr(&our_t_rules, &our_in) < 0) return fr_sbuff_error(&our_in);
+ if (tmpl_cast_from_substr(&our_t_rules, &our_in) < 0) FR_SBUFF_ERROR_RETURN(&our_in);
fr_sbuff_adv_past_whitespace(&our_in, SIZE_MAX, NULL);
fr_sbuff_marker(&m, &our_in);
if (slen < 0) {
error:
talloc_free(vpt);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if ((type != T_BARE_WORD) && !fr_sbuff_next_if_char(&our_in, fr_token_quote[type])) { /* Quoting */
if (cond_normalise(ctx, lhs ? lhs->quote : T_INVALID, &c) < 0) {
talloc_free(c);
fr_sbuff_set_to_start(&our_in);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
*out = c;
fr_sbuff_set(&our_in, in); /* Marker at the start */
error:
tmpl_request_list_talloc_free_to_tail(out, tail);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
fr_strerror_const("Filters not allowed here");
if (err) *err = TMPL_ATTR_ERROR_FILTER_NOT_ALLOWED;
fr_sbuff_set_to_start(&our_name);
- return fr_sbuff_error(&our_name);
+ FR_SBUFF_ERROR_RETURN(&our_name);
}
ar->ar_filter_type = TMPL_ATTR_FILTER_TYPE_INDEX;
fr_strerror_const("No closing ']' for array index");
if (err) *err = TMPL_ATTR_ERROR_INVALID_ARRAY_INDEX;
error:
- return fr_sbuff_error(&our_name);
+ FR_SBUFF_ERROR_RETURN(&our_name);
default:
{
if (err) *err = TMPL_ATTR_ERROR_NESTING_TOO_DEEP;
error:
fr_sbuff_marker_release(&m_s);
- return fr_sbuff_error(name);
+ FR_SBUFF_ERROR_RETURN(name);
}
/*
if (!fr_type_is_leaf(t_rules->cast)) {
fr_strerror_printf("%s is not a valid cast type",
fr_type_to_str(t_rules->cast));
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
vpt = tmpl_alloc_null(ctx);
t_rules->cast, allow_enum ? t_rules->enumv : NULL,
&our_in, p_rules, false) < 0) {
talloc_free(vpt);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
tmpl_init(vpt, TMPL_TYPE_DATA, quote, fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules);
if (!tmpl_substr_terminal_check(&our_in, p_rules)) {
fr_strerror_const("Unexpected text after bool");
- return fr_sbuff_error(in);
+ FR_SBUFF_ERROR_RETURN(in);
}
MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_DATA, T_BARE_WORD, fr_sbuff_start(&our_in), fr_sbuff_used(&our_in)));
fr_strerror_const("Hex string not even length");
error:
talloc_free(vpt);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (len == 0) {
fr_strerror_const("Zero length hex string is invalid");
fr_sbuff_out(NULL, &octet, &our_in) && fr_sbuff_next_if_char(&our_in, '.') &&
fr_sbuff_out(NULL, &octet, &our_in))) {
error:
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
len = fr_sbuff_adv_past_allowed(&our_in, FR_IPADDR_STRLEN + 1, ipv6_chars, NULL);
if ((len < 2) || (len > FR_IPADDR_STRLEN)) {
error:
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
if (!tmpl_substr_terminal_check(&our_in, p_rules)) {
fr_strerror_const("Unexpected text after signed integer");
error:
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_DATA,
if (!tmpl_substr_terminal_check(&our_in, p_rules)) {
fr_strerror_const("Unexpected text after float");
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_DATA,
p_rules, t_rules);
}
- if (slen < 0) return fr_sbuff_error(&our_in);
+ if (slen < 0) FR_SBUFF_ERROR_RETURN(&our_in);
if (xlat_needs_resolving(head)) UNRESOLVED_SET(&type);
}
bareword_error:
talloc_free(vpt);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
slen = xlat_tokenize_ephemeral(vpt, &head, t_rules->xlat.runtime_el,
&our_in, p_rules, t_rules);
}
- if (slen < 0) return fr_sbuff_error(&our_in);
+ if (slen < 0) FR_SBUFF_ERROR_RETURN(&our_in);
/*
* If the string doesn't contain an xlat,
slen = xlat_tokenize_argv(vpt, &head, &our_in, p_rules, t_rules);
if (slen < 0) {
talloc_free(vpt);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (xlat_needs_resolving(head)) UNRESOLVED_SET(&type);
p_rules, t_rules);
}
- if (slen < 0) return fr_sbuff_error(&our_in);
+ if (slen < 0) FR_SBUFF_ERROR_RETURN(&our_in);
/*
* Check if the string actually contains an xlat
default:
fr_assert(0);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
TMPL_VERIFY(vpt);
fr_sbuff_skip_whitespace(&our_in);
if (fr_sbuff_is_char(&our_in, c)) {
fr_strerror_const("Double operator is invalid");
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
}
if (!fr_type_is_leaf(*cast)) {
fr_strerror_printf("Invalid data type '%s' in cast", fr_type_to_str(*cast));
- return fr_sbuff_error(&our_in)
+ FR_SBUFF_ERROR_RETURN(&our_in)
}
if (!fr_sbuff_next_if_char(&our_in, close)) {
fr_strerror_const("Unterminated cast");
- return fr_sbuff_error(&our_in)
+ FR_SBUFF_ERROR_RETURN(&our_in)
}
fr_sbuff_adv_past_whitespace(&our_in, SIZE_MAX, NULL);
if (!vpt) {
error:
talloc_free(node);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
fr_sbuff_marker(&flag, &our_in);
if (tmpl_regex_flags_substr(vpt, &our_in, bracket_rules->terminals) < 0) {
talloc_free(node);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_skip_whitespace(&our_in);
*/
if (tmpl_afrom_substr(node, &vpt, &our_in, quote, p_rules, &our_t_rules) < 0) {
error:
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (quote != T_BARE_WORD) {
* Get the LHS of the operation.
*/
slen = tokenize_unary(head, &lhs, &our_in, p_rules, t_rules, bracket_rules, &c, cond);
- if (slen < 0) return fr_sbuff_error(&our_in);
+ if (slen < 0) FR_SBUFF_ERROR_RETURN(&our_in);
if (slen == 0) {
fr_assert(lhs == NULL);
if (!binary_ops[op].str) {
fr_strerror_printf("Invalid operator");
fr_sbuff_set(&our_in, &m_op);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_assert(precedence[op] != 0);
fr_strerror_printf("Operator '%c' is only applied to the left hand side of the '%s' operation, add (..) to evaluate the operation first", c, fr_tokens[op]);
fail_lhs:
fr_sbuff_set(&our_in, &m_lhs);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_skip_whitespace(&our_in);
if ((op != T_OP_CMP_EQ) && (op != T_OP_NE)) {
fr_strerror_printf("Invalid operatord '%s' for left hand side structural attribute", fr_tokens[op]);
fr_sbuff_set(&our_in, &m_op);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_assert(0);
if (reparse_rcode(head, &rhs, true) < 0) {
fail_rhs:
fr_sbuff_set(&our_in, &m_rhs);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if ((lhs->type == XLAT_FUNC) && (lhs->call.func->token == op)) {
error:
fr_sbuff_marker_release(&m_s);
talloc_free(node);
- return fr_sbuff_error(in);
+ FR_SBUFF_ERROR_RETURN(in);
}
/*
if (xlat_tokenize_string(head, &our_in,
false, p_rules, &our_t_rules) < 0) {
talloc_free(head);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
}
talloc_free(head);
- return fr_sbuff_error(&our_in); /* error */
+ FR_SBUFF_ERROR_RETURN(&our_in); /* error */
}
break;
if (xlat_tokenize_string(head, &our_in,
false, p_rules, t_rules) < 0) {
talloc_free(head);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
if (!a || !b) {
if (a && !b && no_trailing) {
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
break;
}
if (err) *err = FR_SBUFF_PARSE_ERROR_OUT_OF_SPACE;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_advance(&our_in, 8);
bad_format:
if (err) *err = FR_SBUFF_PARSE_ERROR_FORMAT;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (expect_padding) {
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (err) *err = FR_SBUFF_PARSE_OK;
if (err) *err = FR_SBUFF_PARSE_ERROR_OUT_OF_SPACE;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_advance(&our_in, 4);
bad_format:
if (err) *err = FR_SBUFF_PARSE_ERROR_FORMAT;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (expect_padding) {
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_set(in, &our_in);
if (fr_sbuff_used(&our_in) == 0) {
fr_strerror_const("VALUE name is empty");
if (err) *err = FR_SBUFF_PARSE_ERROR_NOT_FOUND;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_strerror_const("VALUE name must contain at least one alpha character");
if (err) *err = FR_SBUFF_PARSE_ERROR_FORMAT;
fr_sbuff_set_to_start(&our_in); /* Marker should be at the start of the enum */
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
if (tt && !fr_sbuff_is_terminal(&our_in, tt)) {
fr_strerror_const("VALUE name has trailing text");
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (out) return fr_sbuff_out_bstrncpy_exact(out, in, fr_sbuff_used(&our_in));
if (err_on_dup && out->_f) { \
fr_strerror_printf("Duplicate regex flag '%c'", *our_in.p); \
if (err) *err = -2; \
- return fr_sbuff_error(&our_in); \
+ FR_SBUFF_ERROR_RETURN(&our_in); \
} \
out->_f = 1; \
break
fr_strerror_printf("Unsupported regex flag '%c'", *our_in.p);
if (err) *err = -1;
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_advance(&our_in, 1);
}
((tolower(*a_end) >= 'a') && (tolower(*a_end) <= 'f')))) { \
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING; \
*out = (_type)(_max); \
- return fr_sbuff_error(&our_in); \
+ FR_SBUFF_ERROR_RETURN(&our_in); \
} \
*out = (_type)(num); \
} else { \
((tolower(*a_end) >= 'a') && (tolower(*a_end) <= 'f')))) { \
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING; \
*out = (_type)(_max); \
- return fr_sbuff_error(&our_in); \
+ FR_SBUFF_ERROR_RETURN(&our_in); \
} \
if (err) *err = FR_SBUFF_PARSE_OK; \
*out = (_type)(num); \
} \
if (no_trailing && (*end != '\0')) { \
if (err) *err = FR_SBUFF_PARSE_ERROR_TRAILING; \
- return fr_sbuff_error(&our_in); \
+ FR_SBUFF_ERROR_RETURN(&our_in); \
} \
*out = res; \
return fr_sbuff_advance(in, end - buff); \
*out = 0;
- if (fr_sbuff_out(NULL, &size, &our_in) < 0) return fr_sbuff_error(&our_in);
+ if (fr_sbuff_out(NULL, &size, &our_in) < 0) FR_SBUFF_ERROR_RETURN(&our_in);
if (!fr_sbuff_extend(&our_in)) goto done;
c = tolower(fr_sbuff_char(&our_in, '\0'));
if (size & 0x01) {
fr_strerror_const("Sizes specified in nibbles must be an even number");
fr_sbuff_set_to_start(&our_in);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
size /= 2;
break;
if (((size_t)c >= units_len) || units[(uint8_t)c] == 0) {
fr_strerror_printf("Unknown unit '%c'", c);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (!fr_multiply(&size, size, units[(uint8_t)c])) {
overflow:
fr_strerror_printf("Value must be less than %zu", (size_t)SIZE_MAX);
fr_sbuff_set_to_start(&our_in);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
}
}
num_error:
fr_strerror_printf("Failed parsing time_delta: %s",
fr_table_str_by_value(sbuff_parse_error_table, sberr, "<INVALID>"));
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_sbuff_out_by_longest_prefix(&match_len, &res, fr_time_precision_table, &our_in, FR_TIME_RES_INVALID);
if (f_len > 9) {
fr_strerror_const("Too much precision for time_delta");
fr_sbuff_set(&our_in, fr_sbuff_current(&m_f) + 10);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
/* Got a qualifier but there's stuff after */
if (res != FR_TIME_RES_INVALID) {
fr_strerror_const("Trailing data after time_delta");
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_strerror_const("Invalid precision qualifier for time_delta");
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/* Scale defaults to hint */
overflow:
fr_strerror_printf("time_delta would %s", negative ? "underflow" : "overflow");
fr_sbuff_set_to_start(&our_in);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
{
if (minutes > UINT16_MAX) {
fr_strerror_printf("minutes component of time_delta is too large");
fr_sbuff_set_to_start(&our_in);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
* hours:minutes:seconds
if (hours > UINT16_MAX) {
fr_strerror_printf("hours component of time_delta is too large");
fr_sbuff_set_to_start(&our_in);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (minutes > UINT16_MAX) {
fr_strerror_printf("minutes component of time_delta is too large");
- return fr_sbuff_error(&m1);
+ FR_SBUFF_ERROR_RETURN(&m1);
}
}
if ((hex_len & 0x01) != 0) {
fr_strerror_printf("Length of hex string is not even, got %zu bytes", hex_len);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
/*
if (unlikely(fr_base16_decode(NULL, &FR_DBUFF_TMP(bin_buff, hex_len), &our_in, false) < 0)) {
talloc_free(bin_buff);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
return fr_sbuff_set(in, &our_in);
if (err != FR_SBUFF_PARSE_OK) {
ether_error:
fr_sbuff_parse_error_to_strerror(err);
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
if (!fr_sbuff_next_if_char(&our_in, ':')) {
ether_sep_error:
fr_strerror_const("Missing separator, expected ':'");
- return fr_sbuff_error(&our_in);
+ FR_SBUFF_ERROR_RETURN(&our_in);
}
fr_base16_decode(&err, &dbuff, &our_in, true);