From: Arran Cudbard-Bell Date: Wed, 1 Nov 2023 21:20:06 +0000 (-0600) Subject: sbuff: When performing prefix matches, always extend by the longest needle X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7f083dafd75d06a24eaaa63fe365e477d8d4e10;p=thirdparty%2Ffreeradius-server.git sbuff: When performing prefix matches, always extend by the longest needle --- diff --git a/src/lib/util/sbuff.h b/src/lib/util/sbuff.h index 4829898f851..103a9f00897 100644 --- a/src/lib/util/sbuff.h +++ b/src/lib/util/sbuff.h @@ -1449,6 +1449,7 @@ size_t fr_sbuff_out_unescape_until(fr_sbuff_t *out, fr_sbuff_t *in, size_t len, #define fr_sbuff_out_by_longest_prefix(_match_len, _out, _table, _sbuff, _def) \ do { \ size_t _match_len_tmp; \ + fr_sbuff_extend_lowat(NULL, _sbuff, fr_table_max_needle_len(_table)); \ *(_out) = fr_table_value_by_longest_prefix(&_match_len_tmp, _table, \ fr_sbuff_current(_sbuff), fr_sbuff_remaining(_sbuff), \ _def); \ diff --git a/src/lib/util/table.h b/src/lib/util/table.h index dbd7d2a15bd..a986a15c217 100644 --- a/src/lib/util/table.h +++ b/src/lib/util/table.h @@ -266,6 +266,37 @@ _Generic((_table), \ fr_table_num_indexed_t const * : fr_table_indexed_str_by_num \ )(_table, _table ## _len, _number, _def) +#define TABLE_TYPE_NEEDLE_LEN_FUNC(_our_table_type, _our_name) \ +static inline size_t _our_name(_our_table_type table, size_t table_len) \ +{ \ + size_t i, max; \ + for (i = 0; i < table_len; i++) if (table->name.len > max) max = table->name.len; \ + return max; \ +} + +TABLE_TYPE_NEEDLE_LEN_FUNC(fr_table_num_sorted_t const *, fr_table_num_sorted_max_needle_len); +TABLE_TYPE_NEEDLE_LEN_FUNC(fr_table_num_ordered_t const *, fr_table_num_ordered_max_needle_len); +TABLE_TYPE_NEEDLE_LEN_FUNC(fr_table_ptr_sorted_t const *, fr_table_ptr_sorted_max_needle_len); +TABLE_TYPE_NEEDLE_LEN_FUNC(fr_table_ptr_ordered_t const *, fr_table_ptr_ordered_max_needle_len); +TABLE_TYPE_NEEDLE_LEN_FUNC(fr_table_num_indexed_bit_pos_t const *, fr_table_num_indexed_bit_pos_max_needle_len); +TABLE_TYPE_NEEDLE_LEN_FUNC(fr_table_num_indexed_t const *, fr_table_num_indexed_max_needle_len); + +#define fr_table_max_needle_len(_table) \ +_Generic((_table), \ + fr_table_num_sorted_t const * : fr_table_num_sorted_max_needle_len, \ + fr_table_num_ordered_t const * : fr_table_num_ordered_max_needle_len, \ + fr_table_num_sorted_t * : fr_table_num_sorted_max_needle_len, \ + fr_table_num_ordered_t * : fr_table_num_ordered_max_needle_len, \ + fr_table_ptr_sorted_t const * : fr_table_ptr_sorted_max_needle_len, \ + fr_table_ptr_ordered_t const * : fr_table_ptr_ordered_max_needle_len, \ + fr_table_ptr_sorted_t * : fr_table_ptr_sorted_max_needle_len, \ + fr_table_ptr_ordered_t * : fr_table_ptr_ordered_max_needle_len, \ + fr_table_num_indexed_bit_pos_t * : fr_table_num_indexed_bit_pos_max_needle_len, \ + fr_table_num_indexed_bit_pos_t const * : fr_table_num_indexed_bit_pos_max_needle_len, \ + fr_table_num_indexed_t * : fr_table_num_indexed_max_needle_len, \ + fr_table_num_indexed_t const * : fr_table_num_indexed_max_needle_len \ +)(_table, _table ## _len) + #ifdef __cplusplus } #endif