From: Alan T. DeKok Date: Mon, 2 Dec 2024 19:11:39 +0000 (-0500) Subject: add fr_dict_t* to test_ctx parameters X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21765a9301cc9be8b282aa09d69c2b5467df8ebf;p=thirdparty%2Ffreeradius-server.git add fr_dict_t* to test_ctx parameters which lets CBOR / DER know what protocol they're using --- diff --git a/src/bin/fuzzer.c b/src/bin/fuzzer.c index 0baa119684f..3ca17f96017 100644 --- a/src/bin/fuzzer.c +++ b/src/bin/fuzzer.c @@ -251,7 +251,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) fr_pair_list_init(&vps); if (!init) LLVMFuzzerInitialize(NULL, NULL); - if (tp->test_ctx && (tp->test_ctx(&decode_ctx, NULL) < 0)) { + if (tp->test_ctx && (tp->test_ctx(&decode_ctx, NULL, dict) < 0)) { fr_perror("fuzzer: Failed initializing test point decode_ctx"); fr_exit_now(EXIT_FAILURE); } diff --git a/src/bin/unit_test_attribute.c b/src/bin/unit_test_attribute.c index fc277cff965..ab94fe563e6 100644 --- a/src/bin/unit_test_attribute.c +++ b/src/bin/unit_test_attribute.c @@ -1571,7 +1571,7 @@ static size_t command_decode_pair(command_result_t *result, command_file_ctx_t * p += slen; fr_skip_whitespace(p); - if (tp->test_ctx && (tp->test_ctx(&decode_ctx, cc->tmp_ctx) < 0)) { + if (tp->test_ctx && (tp->test_ctx(&decode_ctx, cc->tmp_ctx, dictionary_current(cc)) < 0)) { fr_strerror_const_push("Failed initialising decoder testpoint"); RETURN_COMMAND_ERROR(); } @@ -1672,7 +1672,7 @@ static size_t command_decode_proto(command_result_t *result, command_file_ctx_t p += slen; fr_skip_whitespace(p); - if (tp->test_ctx && (tp->test_ctx(&decode_ctx, cc->tmp_ctx) < 0)) { + if (tp->test_ctx && (tp->test_ctx(&decode_ctx, cc->tmp_ctx, dictionary_current(cc)) < 0)) { fr_strerror_const_push("Failed initialising decoder testpoint"); RETURN_COMMAND_ERROR(); } @@ -1906,7 +1906,7 @@ static size_t command_encode_pair(command_result_t *result, command_file_ctx_t * fr_skip_whitespace(p); } - if (tp->test_ctx && (tp->test_ctx(&encode_ctx, cc->tmp_ctx) < 0)) { + if (tp->test_ctx && (tp->test_ctx(&encode_ctx, cc->tmp_ctx, dictionary_current(cc)) < 0)) { fr_strerror_const_push("Failed initialising encoder testpoint"); CLEAR_TEST_POINT(cc); RETURN_COMMAND_ERROR(); @@ -2125,7 +2125,7 @@ static size_t command_encode_proto(command_result_t *result, command_file_ctx_t p += ((size_t)slen); fr_skip_whitespace(p); - if (tp->test_ctx && (tp->test_ctx(&encode_ctx, cc->tmp_ctx) < 0)) { + if (tp->test_ctx && (tp->test_ctx(&encode_ctx, cc->tmp_ctx, dictionary_current(cc)) < 0)) { fr_strerror_const_push("Failed initialising encoder testpoint"); CLEAR_TEST_POINT(cc); RETURN_COMMAND_ERROR(); diff --git a/src/lib/eap_aka_sim/decode.c b/src/lib/eap_aka_sim/decode.c index c541101a204..2b18253a259 100644 --- a/src/lib/eap_aka_sim/decode.c +++ b/src/lib/eap_aka_sim/decode.c @@ -1023,7 +1023,7 @@ static fr_aka_sim_ctx_t *test_ctx_init(TALLOC_CTX *ctx, uint8_t const *k_encr, s /* * Test ctx data */ -static int decode_test_ctx_sim(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx_sim(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_aka_sim_ctx_t *test_ctx; static uint8_t k_encr[] = { 0x00, 0x01, 0x02, 0x03, 0x04 ,0x05, 0x06, 0x07, @@ -1040,7 +1040,7 @@ static int decode_test_ctx_sim(void **out, TALLOC_CTX *ctx) } -static int decode_test_ctx_aka(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx_aka(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_aka_sim_ctx_t *test_ctx; static uint8_t k_encr[] = { 0x00, 0x01, 0x02, 0x03, 0x04 ,0x05, 0x06, 0x07, @@ -1056,7 +1056,7 @@ static int decode_test_ctx_aka(void **out, TALLOC_CTX *ctx) return 0; } -static int decode_test_ctx_sim_rfc4186(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx_sim_rfc4186(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_aka_sim_ctx_t *test_ctx; static uint8_t k_encr[] = { 0x53, 0x6e, 0x5e, 0xbc, 0x44 ,0x65, 0x58, 0x2a, diff --git a/src/lib/eap_aka_sim/encode.c b/src/lib/eap_aka_sim/encode.c index 55052ebf40f..c7e48ba2abf 100644 --- a/src/lib/eap_aka_sim/encode.c +++ b/src/lib/eap_aka_sim/encode.c @@ -1015,7 +1015,7 @@ static fr_aka_sim_ctx_t *test_ctx_init(TALLOC_CTX *ctx, uint8_t const *k_encr, s /* * Test ctx data */ -static int encode_test_ctx_sim(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx_sim(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_aka_sim_ctx_t *test_ctx; static uint8_t k_encr[] = { 0x00, 0x01, 0x02, 0x03, 0x04 ,0x05, 0x06, 0x07, @@ -1031,7 +1031,7 @@ static int encode_test_ctx_sim(void **out, TALLOC_CTX *ctx) return 0; } -static int encode_test_ctx_aka(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx_aka(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_aka_sim_ctx_t *test_ctx; static uint8_t k_encr[] = { 0x00, 0x01, 0x02, 0x03, 0x04 ,0x05, 0x06, 0x07, @@ -1047,7 +1047,7 @@ static int encode_test_ctx_aka(void **out, TALLOC_CTX *ctx) return 0; } -static int encode_test_ctx_sim_rfc4186(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx_sim_rfc4186(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_aka_sim_ctx_t *test_ctx; static uint8_t k_encr[] = { 0x53, 0x6e, 0x5e, 0xbc, 0x44 ,0x65, 0x58, 0x2a, diff --git a/src/lib/io/test_point.h b/src/lib/io/test_point.h index 1f2c6911239..7587a6048c5 100644 --- a/src/lib/io/test_point.h +++ b/src/lib/io/test_point.h @@ -43,9 +43,10 @@ typedef enum { * * @param[out] out Where the decoder context should be written. * @param[in] ctx to allocate the test point context in. + * @param[in] dict the default dictionary context for the test point * @return proto or pair encoder or decoder ctx. */ -typedef int (*fr_test_point_ctx_alloc_t)(void **out, TALLOC_CTX *ctx); +typedef int (*fr_test_point_ctx_alloc_t)(void **out, TALLOC_CTX *ctx, fr_dict_t const *dict); /** A generic interface for decoding packets to fr_pair_ts * diff --git a/src/lib/unlang/xlat_builtin.c b/src/lib/unlang/xlat_builtin.c index 2a0dea1259c..9755e088c02 100644 --- a/src/lib/unlang/xlat_builtin.c +++ b/src/lib/unlang/xlat_builtin.c @@ -3764,7 +3764,7 @@ static xlat_action_t protocol_decode_xlat(TALLOC_CTX *ctx, fr_dcursor_t *out, fr_test_point_pair_decode_t const *tp_decode = *(void * const *)xctx->inst; if (tp_decode->test_ctx) { - if (tp_decode->test_ctx(&decode_ctx, ctx) < 0) { + if (tp_decode->test_ctx(&decode_ctx, ctx, request->dict) < 0) { return XLAT_ACTION_FAIL; } } @@ -3899,7 +3899,7 @@ static xlat_action_t protocol_encode_xlat(TALLOC_CTX *ctx, fr_dcursor_t *out, * Create the encoding context. */ if (tp_encode->test_ctx) { - if (tp_encode->test_ctx(&encode_ctx, vpt) < 0) { + if (tp_encode->test_ctx(&encode_ctx, vpt, request->dict) < 0) { talloc_free(vpt); return XLAT_ACTION_FAIL; } diff --git a/src/lib/util/fuzzer.c b/src/lib/util/fuzzer.c index b167686ed70..864f2e54299 100644 --- a/src/lib/util/fuzzer.c +++ b/src/lib/util/fuzzer.c @@ -24,7 +24,7 @@ RCSID("$Id$") #include -static int decode_test_ctx(void **out, UNUSED TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, UNUSED TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { *out = NULL; return 0; diff --git a/src/protocols/arp/base.c b/src/protocols/arp/base.c index 5deb6d5ea17..f3b58faa30b 100644 --- a/src/protocols/arp/base.c +++ b/src/protocols/arp/base.c @@ -305,7 +305,7 @@ typedef struct { bool tmp; } fr_arp_ctx_t; -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_arp_ctx_t *test_ctx; diff --git a/src/protocols/bfd/decode.c b/src/protocols/bfd/decode.c index debfba70d72..e2788a0ea0e 100644 --- a/src/protocols/bfd/decode.c +++ b/src/protocols/bfd/decode.c @@ -99,7 +99,7 @@ ssize_t fr_bfd_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, return slen; } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_bfd_ctx_t *test_ctx; diff --git a/src/protocols/bfd/encode.c b/src/protocols/bfd/encode.c index 6c8153134cf..232a68bda8f 100644 --- a/src/protocols/bfd/encode.c +++ b/src/protocols/bfd/encode.c @@ -162,7 +162,7 @@ ssize_t fr_bfd_encode(uint8_t *out, size_t outlen, UNUSED uint8_t const *origina } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_bfd_ctx_t *test_ctx; diff --git a/src/protocols/cbor/base.c b/src/protocols/cbor/base.c index 3d39ae5fd68..7d55f2306d2 100644 --- a/src/protocols/cbor/base.c +++ b/src/protocols/cbor/base.c @@ -69,3 +69,39 @@ extern fr_test_point_pair_decode_t cbor_tp_decode_pair; fr_test_point_pair_decode_t cbor_tp_decode_pair = { .func = decode_pair }; + +static int decode_test_ctx(void **out, UNUSED TALLOC_CTX *ctx, fr_dict_t const *dict) +{ + *out = UNCONST(fr_dict_t *, dict); + + return 0; +} + +static ssize_t encode_proto(UNUSED TALLOC_CTX *ctx, fr_pair_list_t *vps, uint8_t *data, size_t data_len, UNUSED void *proto_ctx) +{ + fr_dbuff_t dbuff; + fr_dcursor_t cursor; + + FR_DBUFF_INIT(&dbuff, data, data_len); + + fr_pair_dcursor_init(&cursor, vps); + return encode_pair(&dbuff, &cursor, NULL); +} + +static ssize_t decode_proto(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t const *data, size_t data_len, void *proto_ctx) +{ + fr_dict_t *dict = proto_ctx; + + return decode_pair(ctx, out, fr_dict_root(dict), data, data_len, proto_ctx); +} + +extern fr_test_point_proto_encode_t cbor_tp_encode_proto; +fr_test_point_proto_encode_t cbor_tp_encode_proto = { + .func = encode_proto +}; + +extern fr_test_point_proto_decode_t cbor_tp_decode_proto; +fr_test_point_proto_decode_t cbor_tp_decode_proto = { + .test_ctx = decode_test_ctx, + .func = decode_proto +}; diff --git a/src/protocols/dhcpv4/decode.c b/src/protocols/dhcpv4/decode.c index 297cb6eed16..2b1da445986 100644 --- a/src/protocols/dhcpv4/decode.c +++ b/src/protocols/dhcpv4/decode.c @@ -685,7 +685,7 @@ ssize_t fr_dhcpv4_decode_foreign(TALLOC_CTX *ctx, fr_pair_list_t *out, } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_dhcpv4_ctx_t *test_ctx; diff --git a/src/protocols/dhcpv4/encode.c b/src/protocols/dhcpv4/encode.c index 804aa699298..8df8f68d675 100644 --- a/src/protocols/dhcpv4/encode.c +++ b/src/protocols/dhcpv4/encode.c @@ -803,7 +803,7 @@ static ssize_t fr_dhcpv4_encode_proto(UNUSED TALLOC_CTX *ctx, fr_pair_list_t *vp return fr_dhcpv4_encode_dbuff(&FR_DBUFF_TMP(data, data_len), NULL, 0, 0, vps); } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_dhcpv4_ctx_t *test_ctx; diff --git a/src/protocols/dhcpv6/decode.c b/src/protocols/dhcpv6/decode.c index c33c1390574..034b2c8e043 100644 --- a/src/protocols/dhcpv6/decode.c +++ b/src/protocols/dhcpv6/decode.c @@ -472,7 +472,7 @@ ssize_t fr_dhcpv6_decode_foreign(TALLOC_CTX *ctx, fr_pair_list_t *out, return data_len; } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_dhcpv6_decode_ctx_t *test_ctx; diff --git a/src/protocols/dhcpv6/encode.c b/src/protocols/dhcpv6/encode.c index c78dd365d22..84989eb5d2a 100644 --- a/src/protocols/dhcpv6/encode.c +++ b/src/protocols/dhcpv6/encode.c @@ -740,7 +740,7 @@ ssize_t fr_dhcpv6_encode_foreign(fr_dbuff_t *dbuff, fr_pair_list_t const *list) } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_dhcpv6_encode_ctx_t *test_ctx; diff --git a/src/protocols/dns/decode.c b/src/protocols/dns/decode.c index 7dd755c80d3..d237a297b90 100644 --- a/src/protocols/dns/decode.c +++ b/src/protocols/dns/decode.c @@ -372,7 +372,7 @@ static ssize_t decode_rr(TALLOC_CTX *ctx, fr_pair_list_t *out, UNUSED fr_dict_at /* * Test points */ -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_dns_ctx_t *test_ctx; diff --git a/src/protocols/dns/encode.c b/src/protocols/dns/encode.c index 3acb03c834f..eab30c4c1cf 100644 --- a/src/protocols/dns/encode.c +++ b/src/protocols/dns/encode.c @@ -509,7 +509,7 @@ ssize_t fr_dns_encode(fr_dbuff_t *dbuff, fr_pair_list_t *vps, fr_dns_ctx_t *pack return fr_dbuff_set(dbuff, &work_dbuff); } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_dns_ctx_t *test_ctx; diff --git a/src/protocols/radius/decode.c b/src/protocols/radius/decode.c index b908d894a38..d3a35d64965 100644 --- a/src/protocols/radius/decode.c +++ b/src/protocols/radius/decode.c @@ -2138,7 +2138,7 @@ static int _test_ctx_free(fr_radius_decode_ctx_t *ctx) return 0; } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { static uint8_t vector[RADIUS_AUTH_VECTOR_LENGTH] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, diff --git a/src/protocols/radius/encode.c b/src/protocols/radius/encode.c index 2a64d54fcb0..9656d434fa7 100644 --- a/src/protocols/radius/encode.c +++ b/src/protocols/radius/encode.c @@ -1699,7 +1699,7 @@ ssize_t fr_radius_encode_foreign(fr_dbuff_t *dbuff, fr_pair_list_t const *list) } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { static uint8_t vector[RADIUS_AUTH_VECTOR_LENGTH] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, diff --git a/src/protocols/tacacs/decode.c b/src/protocols/tacacs/decode.c index 88374eb01c4..ad7d42c9710 100644 --- a/src/protocols/tacacs/decode.c +++ b/src/protocols/tacacs/decode.c @@ -1088,7 +1088,7 @@ static int _encode_test_ctx(fr_tacacs_ctx_t *proto_ctx) return 0; } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_tacacs_ctx_t *test_ctx; diff --git a/src/protocols/tacacs/encode.c b/src/protocols/tacacs/encode.c index 378aad31797..b601b19bd59 100644 --- a/src/protocols/tacacs/encode.c +++ b/src/protocols/tacacs/encode.c @@ -1057,7 +1057,7 @@ static int _encode_test_ctx(fr_tacacs_ctx_t *proto_ctx) return 0; } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_tacacs_ctx_t *test_ctx; diff --git a/src/protocols/tftp/decode.c b/src/protocols/tftp/decode.c index 106a0161b95..23a8e9734a3 100644 --- a/src/protocols/tftp/decode.c +++ b/src/protocols/tftp/decode.c @@ -292,7 +292,7 @@ static int _decode_test_ctx(UNUSED fr_tftp_ctx_t *proto_ctx) return 0; } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_tftp_ctx_t *test_ctx; diff --git a/src/protocols/tftp/encode.c b/src/protocols/tftp/encode.c index 3ade5916865..97f162e8cee 100644 --- a/src/protocols/tftp/encode.c +++ b/src/protocols/tftp/encode.c @@ -254,7 +254,7 @@ static int _encode_test_ctx(UNUSED fr_tftp_ctx_t *proto_ctx) return 0; } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_tftp_ctx_t *test_ctx; diff --git a/src/protocols/vmps/vmps.c b/src/protocols/vmps/vmps.c index 5942c3c9a9e..137ce952f0a 100644 --- a/src/protocols/vmps/vmps.c +++ b/src/protocols/vmps/vmps.c @@ -521,7 +521,7 @@ static int _decode_test_ctx(UNUSED fr_vmps_ctx_t *proto_ctx) return 0; } -static int decode_test_ctx(void **out, TALLOC_CTX *ctx) +static int decode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_vmps_ctx_t *test_ctx; @@ -562,7 +562,7 @@ static int _encode_test_ctx(UNUSED fr_vmps_ctx_t *proto_ctx) return 0; } -static int encode_test_ctx(void **out, TALLOC_CTX *ctx) +static int encode_test_ctx(void **out, TALLOC_CTX *ctx, UNUSED fr_dict_t const *dict) { fr_vmps_ctx_t *test_ctx;