26RCSID(
"$Id: f549d5adcf81a3b8a81d7ccfb807752a2874cadd $")
28#include <freeradius-devel/server/regex.h>
29#include <freeradius-devel/server/request_data.h>
30#include <freeradius-devel/util/debug.h>
34#define REQUEST_DATA_REGEX (0xadbeef00)
37#if defined(HAVE_REGEX_PCRE2)
40 fr_regmatch_t *regmatch;
62 fr_regcapture_t *old_rc, *new_rc;
69 DEBUG4(
"Clearing %zu matches", old_rc->regmatch->used);
75 if (!regmatch || ((*regmatch)->used == 0))
return;
81 DEBUG4(
"Adding %zu matches", (*regmatch)->used);
86 MEM(new_rc = talloc(request, fr_regcapture_t));
91#if defined(HAVE_REGEX_PCRE2)
92 if (!(*preg)->precompiled) {
93 new_rc->preg = talloc_steal(new_rc, *preg);
103 new_rc->regmatch = talloc_steal(new_rc, *regmatch);
104 new_rc->safety = *safety;
110# if defined(HAVE_REGEX_PCRE2)
129 pcre2_match_data *match_data;
133 RDEBUG4(
"No subcapture data found");
136 match_data = talloc_get_type_abort(rc->regmatch->match_data, pcre2_match_data);
138 ret = pcre2_substring_length_bynumber(match_data, num, &
len);
140 case PCRE2_ERROR_NOMEMORY:
147 case PCRE2_ERROR_NOSUBSTRING:
148 RDEBUG4(
"%i/%zu Not found", num + 1, rc->regmatch->used);
157 pcre2_substring_copy_bynumber(match_data, num, (PCRE2_UCHAR *)
buff, &
len);
163 RDEBUG4(
"%i/%zu Found: %pV (%zu)", num + 1, rc->regmatch->used,
out,
out->vb_length);
188 pcre2_match_data *match_data;
192 RDEBUG4(
"No subcapture data found");
195 match_data = rc->regmatch->match_data;
197 ret = pcre2_substring_length_byname(match_data, (PCRE2_UCHAR
const *)
name, &
len);
199 case PCRE2_ERROR_NOMEMORY:
206 case PCRE2_ERROR_NOSUBSTRING:
211 if (ret < 0)
return -1;
214 pcre2_substring_copy_byname(match_data, (PCRE2_UCHAR
const *)
name, (PCRE2_UCHAR *)
buff, &
len);
245 regmatch_t *match_data;
249 RDEBUG4(
"No subcapture data found");
252 match_data = rc->regmatch->match_data;
259 if ((num >= rc->regmatch->used) || (match_data[num].rm_eo == -1) || (match_data[num].rm_so == -1)) {
260 RDEBUG4(
"%i/%zu Not found", num + 1, rc->regmatch->used);
267 fr_assert(match_data[num].rm_eo <= (regoff_t)talloc_array_length(rc->regmatch->subject));
268 fr_assert(match_data[num].rm_so <= (regoff_t)talloc_array_length(rc->regmatch->subject));
270 start = rc->regmatch->subject + match_data[num].rm_so;
271 len = match_data[num].rm_eo - match_data[num].rm_so;
279 RDEBUG4(
"%i/%zu Found: %pV (%zu)", num + 1, rc->regmatch->used,
out,
out->vb_length);
@ FR_TYPE_STRING
String of printable characters.
void * request_data_reference(request_t *request, void const *unique_ptr, int unique_int)
Get opaque data from a request without removing it.
void * request_data_get(request_t *request, void const *unique_ptr, int unique_int)
Get opaque data from a request.
#define request_data_talloc_add(_request, _unique_ptr, _unique_int, _type, _opaque, _free_on_replace, _free_on_parent, _persist)
Add opaque data to a request_t.
static char buff[sizeof("18446744073709551615")+3]
char * talloc_bstrndup(TALLOC_CTX *ctx, char const *in, size_t inlen)
Binary safe strndup function.
void fr_value_box_safety_set(fr_value_box_t *box, fr_value_box_safety_t const *safety)
Replace the safety of a box.
void fr_value_box_bstrndup_shallow(fr_value_box_t *dst, fr_dict_attr_t const *enumv, char const *src, size_t len, bool tainted)
Assign a string to to a fr_value_box_t.
static fr_sbuff_err_t char ** out
static fr_sbuff_err_t char size_t * len
#define fr_value_box_init(_vb, _type, _enumv, _tainted)
Initialise a fr_value_box_t.