From: Alan T. DeKok Date: Thu, 17 Oct 2024 13:34:08 +0000 (-0400) Subject: add and use explicit verify_ctx for BIO X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a61c8b292906fab689825ba86228a93c726bcddb;p=thirdparty%2Ffreeradius-server.git add and use explicit verify_ctx for BIO so that bio->ctx can always be application data --- diff --git a/src/lib/bio/mem.c b/src/lib/bio/mem.c index 0f695c5b866..e16ac91359f 100644 --- a/src/lib/bio/mem.c +++ b/src/lib/bio/mem.c @@ -36,6 +36,7 @@ typedef struct fr_bio_mem_s { FR_BIO_COMMON; fr_bio_verify_t verify; //!< verify data to see if we have a packet. + void *verify_ctx; //!< verify context fr_bio_buf_t read_buffer; //!< buffering for reads fr_bio_buf_t write_buffer; //!< buffering for writes @@ -330,7 +331,7 @@ static ssize_t fr_bio_mem_read_verify_datagram(fr_bio_t *bio, void *packet_ctx, * @todo - if we're allowed more than one packet in the buffer, we should just call * fr_bio_mem_read_verify(), or this function should call fr_bio_mem_call_verify(). */ - switch (my->verify((fr_bio_t *) my, packet_ctx, buffer, &want)) { + switch (my->verify((fr_bio_t *) my, my->verify_ctx, packet_ctx, buffer, &want)) { /* * The data in the buffer is exactly a packet. Return that. * @@ -631,7 +632,7 @@ static int fr_bio_mem_call_verify(fr_bio_t *bio, void *packet_ctx, size_t *size) want = end - packet; - switch (my->verify((fr_bio_t *) my, packet_ctx, packet, &want)) { + switch (my->verify((fr_bio_t *) my, my->verify_ctx, packet_ctx, packet, &want)) { /* * The data in the buffer is exactly a packet. Return that. * @@ -738,7 +739,7 @@ fr_bio_t *fr_bio_mem_alloc(TALLOC_CTX *ctx, size_t read_size, size_t write_size, my->bio.write = fr_bio_next_write; } my->priv_cb.eof = fr_bio_mem_eof; - my->priv_cb.flush = fr_bio_mem_flush; + my->priv_cb.write_resume = fr_bio_mem_write_resume; fr_bio_chain(&my->bio, next); @@ -855,7 +856,7 @@ fr_bio_t *fr_bio_mem_sink_alloc(TALLOC_CTX *ctx, size_t read_size) * - <0 on error * - 0 on success */ -int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, bool datagram) +int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, void *verify_ctx, bool datagram) { fr_bio_mem_t *my = talloc_get_type_abort(bio, fr_bio_mem_t); @@ -865,6 +866,7 @@ int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, bool datagram) } my->verify = verify; + my->verify_ctx = verify_ctx; /* * If we are writing datagrams, then we cannot buffer individual datagrams. We must write diff --git a/src/lib/bio/mem.h b/src/lib/bio/mem.h index 724c148fcb2..a3f9468b7a5 100644 --- a/src/lib/bio/mem.h +++ b/src/lib/bio/mem.h @@ -42,12 +42,13 @@ typedef enum { * update the packet_ctx to say "dup", and then return OK. * * @param bio the bio to read + * @param verify_ctx data specific for verifying * @param packet_ctx as passed in to fr_bio_read() * @param buffer pointer to the raw data * @param[in,out] size in: size of data in the buffer. out: size of the packet to return, or data to discard. * @return action to take */ -typedef fr_bio_verify_action_t (*fr_bio_verify_t)(fr_bio_t *bio, void *packet_ctx, const void *buffer, size_t *size); +typedef fr_bio_verify_action_t (*fr_bio_verify_t)(fr_bio_t *bio, void *verify_ctx, void *packet_ctx, const void *buffer, size_t *size); fr_bio_t *fr_bio_mem_alloc(TALLOC_CTX *ctx, size_t read_size, size_t write_size, fr_bio_t *next) CC_HINT(nonnull); @@ -59,6 +60,6 @@ uint8_t const *fr_bio_mem_read_peek(fr_bio_t *bio, size_t *size) CC_HINT(nonnull void fr_bio_mem_read_discard(fr_bio_t *bio, size_t size) CC_HINT(nonnull); -int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, bool datagram) CC_HINT(nonnull); +int fr_bio_mem_set_verify(fr_bio_t *bio, fr_bio_verify_t verify, void *verify_ctx, bool datagram) CC_HINT(nonnull); int fr_bio_mem_write_resume(fr_bio_t *bio) CC_HINT(nonnull); diff --git a/src/protocols/radius/bio.c b/src/protocols/radius/bio.c index a6987b9fe50..4fcfc3e03d0 100644 --- a/src/protocols/radius/bio.c +++ b/src/protocols/radius/bio.c @@ -29,11 +29,11 @@ RCSID("$Id$") /** Callback for RADIUS packet verification. * */ -fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size) +fr_bio_verify_action_t fr_radius_bio_verify(UNUSED fr_bio_t *bio, void *verify_ctx, UNUSED void *packet_ctx, const void *data, size_t *size) { decode_fail_t failure; size_t in_buffer = *size; - fr_radius_bio_verify_t *uctx = bio->uctx; + fr_radius_bio_verify_t *uctx = verify_ctx; uint8_t const *hdr = data; if (in_buffer < 4) { @@ -61,11 +61,11 @@ fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, UNUSED void *packet_c /** And verify a datagram packet. * */ -fr_bio_verify_action_t fr_radius_bio_verify_datagram(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size) +fr_bio_verify_action_t fr_radius_bio_verify_datagram(UNUSED fr_bio_t *bio, void *verify_ctx, UNUSED void *packet_ctx, const void *data, size_t *size) { decode_fail_t failure; size_t in_buffer = *size; - fr_radius_bio_verify_t *uctx = bio->uctx; + fr_radius_bio_verify_t *uctx = verify_ctx; uint8_t const *hdr = data; if (in_buffer < RADIUS_HEADER_LENGTH) return FR_BIO_VERIFY_DISCARD; diff --git a/src/protocols/radius/bio.h b/src/protocols/radius/bio.h index 062f1a0d345..152fcf552ae 100644 --- a/src/protocols/radius/bio.h +++ b/src/protocols/radius/bio.h @@ -42,6 +42,6 @@ typedef struct { bool limit_proxy_state; } fr_radius_bio_verify_t; -fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size); +fr_bio_verify_action_t fr_radius_bio_verify(fr_bio_t *bio, void *verify_ctx, void *packet_ctx, const void *data, size_t *size) CC_HINT(nonnull(1,2,4)); -fr_bio_verify_action_t fr_radius_bio_verify_datagram(fr_bio_t *bio, UNUSED void *packet_ctx, const void *data, size_t *size); +fr_bio_verify_action_t fr_radius_bio_verify_datagram(fr_bio_t *bio, void *verify_ctx , void *packet_ctx, const void *data, size_t *size) CC_HINT(nonnull(1,2,4)); diff --git a/src/protocols/radius/client.c b/src/protocols/radius/client.c index 1a183eda34b..630e7179d79 100644 --- a/src/protocols/radius/client.c +++ b/src/protocols/radius/client.c @@ -115,7 +115,7 @@ fr_radius_client_fd_bio_t *fr_radius_client_fd_bio_alloc(TALLOC_CTX *ctx, size_t my->mem = fr_bio_mem_alloc(my, read_size, 2 * 4096, my->fd); if (!my->mem) goto fail; - my->mem->uctx = &my->cfg.verify; + my->mem->uctx = my; if (cfg->packet_cb_cfg.retry) rewrite = radius_client_retry; diff --git a/src/protocols/radius/client_tcp.c b/src/protocols/radius/client_tcp.c index f4687166c98..79118273f79 100644 --- a/src/protocols/radius/client_tcp.c +++ b/src/protocols/radius/client_tcp.c @@ -54,7 +54,7 @@ fr_bio_packet_t *fr_radius_client_tcp_bio_alloc(TALLOC_CTX *ctx, fr_radius_clien my = fr_radius_client_fd_bio_alloc(ctx, 2 * 4096, cfg, fd_cfg); if (!my) return NULL; - if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify, true) < 0) { + if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify, &my->cfg.verify, true) < 0) { talloc_free(my); return NULL; } diff --git a/src/protocols/radius/client_udp.c b/src/protocols/radius/client_udp.c index df198ede4c6..d008b485e3d 100644 --- a/src/protocols/radius/client_udp.c +++ b/src/protocols/radius/client_udp.c @@ -55,7 +55,7 @@ fr_bio_packet_t *fr_radius_client_udp_bio_alloc(TALLOC_CTX *ctx, fr_radius_clien my = fr_radius_client_fd_bio_alloc(ctx, 2 * 4096, cfg, fd_cfg); if (!my) return NULL; - if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, true) < 0) { + if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, &my->cfg.verify, true) < 0) { talloc_free(my); return NULL; } diff --git a/src/protocols/radius/server_udp.c b/src/protocols/radius/server_udp.c index b38304911cd..f753e259b5d 100644 --- a/src/protocols/radius/server_udp.c +++ b/src/protocols/radius/server_udp.c @@ -111,7 +111,7 @@ fr_bio_packet_t *fr_radius_server_udp_bio_alloc(TALLOC_CTX *ctx, fr_radius_serve my = fr_radius_server_fd_bio_alloc(ctx, 2 * 4096, cfg, fd_cfg); if (!my) return NULL; - if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, true) < 0) { + if (fr_bio_mem_set_verify(my->mem, fr_radius_bio_verify_datagram, &my->cfg.verify, true) < 0) { fail: talloc_free(my); return NULL;