]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
sbuff: When performing prefix matches, always extend by the longest needle
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 1 Nov 2023 21:20:06 +0000 (15:20 -0600)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Wed, 1 Nov 2023 21:22:30 +0000 (15:22 -0600)
src/lib/util/sbuff.h
src/lib/util/table.h

index 4829898f8511e886122b962110531f78c7fa86b1..103a9f00897dfbcb41612e9e0eef6b6116f68ba5 100644 (file)
@@ -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); \
index dbd7d2a15bdd169c3185cec891e357e1feb6ede3..a986a15c2175863730f35b2cc4d002066adeb56f 100644 (file)
@@ -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