]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add and use explicit verify_ctx for BIO
authorAlan T. DeKok <aland@freeradius.org>
Thu, 17 Oct 2024 13:34:08 +0000 (09:34 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 21 Oct 2024 13:10:36 +0000 (09:10 -0400)
so that bio->ctx can always be application data

src/lib/bio/mem.c
src/lib/bio/mem.h
src/protocols/radius/bio.c
src/protocols/radius/bio.h
src/protocols/radius/client.c
src/protocols/radius/client_tcp.c
src/protocols/radius/client_udp.c
src/protocols/radius/server_udp.c

index 0f695c5b866bd9559c8ee572e1c181be07988d43..e16ac91359fa619a52a5093b56c68dc55b3d96d1 100644 (file)
@@ -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
index 724c148fcb28844331074ea4c501912086337f42..a3f9468b7a5322728113a0f13b0c4b814ee3ace3 100644 (file)
@@ -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);
index a6987b9fe50e80fb94aadb82296720b92c4b0873..4fcfc3e03d03a52b621d35506497b5c54b18ba42 100644 (file)
@@ -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;
index 062f1a0d345807e2b6380a69b842ec2a1d3cde89..152fcf552aed2ded2525652d68c1ed7b92008e10 100644 (file)
@@ -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));
index 1a183eda34b14917637054af77ad02aeef85a63b..630e7179d79f46efc32c4dda268ff5c8fe8d0a12 100644 (file)
@@ -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;
 
index f4687166c988e0e09d6bd5eae3b9606f042f324d..79118273f79cd5437d8494c0d9e242edb762ff0d 100644 (file)
@@ -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;
        }
index df198ede4c6ff96181181b091f6fb6587ac3a39a..d008b485e3de2b438624e00575e63ab4252c0a06 100644 (file)
@@ -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;
        }
index b38304911cd37c14faf596b8edfcfc21cc6a26a9..f753e259b5d9826882fc06effa42bff7bdd8ca74 100644 (file)
@@ -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;