neels has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-bts/+/39379?usp=email )


Change subject: trx_data_read_cb(): make length checks waterproof
......................................................................

trx_data_read_cb(): make length checks waterproof

Header lengths are defined in two places:
- trx_data_rx_hdr_len[],
- rc of trx_data_handle_*().

Before this patch, we used the one to validate the length, and the other
to read the buffer data.

Use only the trx_data_rx_hdr_len[] values for validation as well as
reading.

Make sure that any (successful) return values exactly match the header
length that was valiated earlier.

Use a separate rc variable (of the more fitting int type) for the
function calls, and keep only one unchanging hdr_len from the start.

Related: CID#465552
Change-Id: Ic658824a5884598d1245511897bcc00050c14317
---
M src/osmo-bts-trx/trx_if.c
1 file changed, 14 insertions(+), 7 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/79/39379/1

diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c
index b6b20e9..4aeac6d 100644
--- a/src/osmo-bts-trx/trx_if.c
+++ b/src/osmo-bts-trx/trx_if.c
@@ -1023,6 +1023,7 @@
        struct trx_ul_burst_ind bi;
        ssize_t hdr_len, buf_len;
        uint8_t pdu_ver;
+       int rc;

        buf_len = recv(ofd->fd, trx_data_buf, sizeof(trx_data_buf), 0);
        if (OSMO_UNLIKELY(buf_len <= 0)) {
@@ -1053,23 +1054,24 @@
                bi.flags = 0x00;

                /* Make sure that we have enough bytes to parse the header */
-               if (OSMO_UNLIKELY(buf_len < trx_data_rx_hdr_len[pdu_ver])) {
+               hdr_len = trx_data_rx_hdr_len[pdu_ver];
+               if (OSMO_UNLIKELY(buf_len < hdr_len)) {
                        LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,
                                "Rx malformed TRXDv%u PDU: len=%zd < expected 
%u\n",
-                               pdu_ver, buf_len, trx_data_rx_hdr_len[pdu_ver]);
+                               pdu_ver, buf_len, hdr_len);
                        return -EINVAL;
                }

                /* Parse header depending on the PDU version */
                switch (pdu_ver) {
                case 0: /* TRXDv0 */
-                       hdr_len = trx_data_handle_hdr_v0(l1h->phy_inst, &bi, 
buf, buf_len);
+                       rc = trx_data_handle_hdr_v0(l1h->phy_inst, &bi, buf, 
buf_len);
                        break;
                case 1: /* TRXDv1 */
-                       hdr_len = trx_data_handle_hdr_v1(l1h->phy_inst, &bi, 
buf, buf_len);
+                       rc = trx_data_handle_hdr_v1(l1h->phy_inst, &bi, buf, 
buf_len);
                        break;
                case 2: /* TRXDv2 */
-                       hdr_len = trx_data_handle_pdu_v2(l1h->phy_inst, &bi, 
buf, buf_len);
+                       rc = trx_data_handle_pdu_v2(l1h->phy_inst, &bi, buf, 
buf_len);
                        break;
                default:
                        /* Shall not happen */
@@ -1077,8 +1079,13 @@
                }

                /* Header parsing error */
-               if (OSMO_UNLIKELY(hdr_len < 0))
-                       return hdr_len;
+               if (OSMO_UNLIKELY(rc < 0))
+                       return rc;
+
+               /* CID#465552: make sure buf_len - hdr_len can never become 
negative. It is already implied, but the
+                * indirection of hdr_len returned by trx_data_handle_*() opens 
more bug vectors. So make sure the
+                * trx_data_handle_*() return value is identical to the 
initially validated length. */
+               OSMO_ASSERT(rc == hdr_len);

                if (OSMO_UNLIKELY(bi.fn >= GSM_TDMA_HYPERFRAME)) {
                        LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,

--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/39379?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: Ic658824a5884598d1245511897bcc00050c14317
Gerrit-Change-Number: 39379
Gerrit-PatchSet: 1
Gerrit-Owner: neels <[email protected]>

Reply via email to