This is an automated email from the ASF dual-hosted git repository.

janc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git


The following commit(s) were added to refs/heads/master by this push:
     new 4f75c0b3b nimble/mesh: Add check for rx buffer in PB ADV
4f75c0b3b is described below

commit 4f75c0b3b466186beff40e8489870c6cee076aaa
Author: Szymon Janc <[email protected]>
AuthorDate: Mon Sep 23 14:20:15 2024 +0200

    nimble/mesh: Add check for rx buffer in PB ADV
    
    Validate if Transaction Continuation PDU can fit into buffer before
    copying data.
---
 nimble/host/mesh/src/pb_adv.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/nimble/host/mesh/src/pb_adv.c b/nimble/host/mesh/src/pb_adv.c
index 19d179c85..76b96ae36 100644
--- a/nimble/host/mesh/src/pb_adv.c
+++ b/nimble/host/mesh/src/pb_adv.c
@@ -32,6 +32,7 @@
 
 #define START_PAYLOAD_MAX 20
 #define CONT_PAYLOAD_MAX  23
+#define RX_BUFFER_MAX     65
 
 #define START_LAST_SEG(gpc) (gpc >> 2)
 #define CONT_SEG_INDEX(gpc) (gpc >> 2)
@@ -41,7 +42,8 @@
 #define LINK_ACK        0x01
 #define LINK_CLOSE      0x02
 
-#define XACT_SEG_DATA(_seg) (&link.rx.buf->om_data[20 + ((_seg - 1) * 23)])
+#define XACT_SEG_OFFSET(_seg) (20 + ((_seg - 1) * 23))
+#define XACT_SEG_DATA(_seg) (&link.rx.buf->om_data[XACT_SEG_OFFSET(_seg)])
 #define XACT_SEG_RECV(_seg) (link.rx.seg &= ~(1 << (_seg)))
 
 #define XACT_ID_MAX  0x7f
@@ -224,7 +226,7 @@ static void reset_adv_link(void)
        }
        link.tx.pending_ack = XACT_ID_NVAL;
        if (!rx_buf) {
-               rx_buf = NET_BUF_SIMPLE(65);
+               rx_buf = NET_BUF_SIMPLE(RX_BUFFER_MAX);
        }
        link.rx.buf = rx_buf;
        net_buf_simple_reset(link.rx.buf);
@@ -388,6 +390,11 @@ static void gen_prov_cont(struct prov_rx *rx, struct 
os_mbuf *buf)
                return;
        }
 
+       if (XACT_SEG_OFFSET(seg) + buf->om_len > RX_BUFFER_MAX) {
+               BT_WARN("Rx buffer overflow. Malformed generic prov frame?");
+               return;
+       }
+
        memcpy(XACT_SEG_DATA(seg), buf->om_data, buf->om_len);
        XACT_SEG_RECV(seg);
 
@@ -892,7 +899,7 @@ void pb_adv_init(void)
        k_work_init_delayable(&link.tx.retransmit, prov_retransmit);
 
     if (!rx_buf) {
-        rx_buf = NET_BUF_SIMPLE(65);
+        rx_buf = NET_BUF_SIMPLE(RX_BUFFER_MAX);
     }
     link.rx.buf = rx_buf;
     net_buf_simple_reset(link.rx.buf);

Reply via email to