fixeria has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmocore/+/30580 )


Change subject: gsm0808: use new gsm0808_enc_speech_codec[_list]2() API
......................................................................

gsm0808: use new gsm0808_enc_speech_codec[_list]2() API

The motivation behind adding and using the new API is explained in
the preceeding change [1].  Whenever any of the encoding functions
fails to encode either a Speech Codec or a Codec List IE, free()
the msgb and return NULL.

Change-Id: I28219b61b9347f0652f9fd0c717f6cdf3c63e8f9
Related: [1] I199ffa0ba4a64813238519178155dfc767aa3975
Related: SYS#6229
---
M src/gsm/gsm0808.c
M tests/gsm0808/gsm0808_test.c
2 files changed, 89 insertions(+), 29 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/80/30580/1

diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c
index 89a8874..ec4c39b 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -100,13 +100,19 @@
                     msgb_l3len(msg_l3), msg_l3->l3h);

        /* AoIP: add Codec List (BSS Supported) 3.2.2.103 */
-       if (scl)
-               gsm0808_enc_speech_codec_list(msg, scl);
+       if (scl) {
+               if (gsm0808_enc_speech_codec_list2(msg, scl) < 0)
+                       goto exit_free;
+       }

        /* push the bssmap header */
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create "Complete L3 Info" for A, legacy implementation.
@@ -530,8 +536,10 @@
        }

        /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */
-       if (scl)
-               gsm0808_enc_speech_codec_list(msg, scl);
+       if (scl) {
+               if (gsm0808_enc_speech_codec_list2(msg, scl) < 0)
+                       goto exit_free;
+       }

        /* AoIP: Call Identifier 3.2.2.105 */
        if (ci) {
@@ -552,6 +560,10 @@
            msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 ยง3.2.1.1.
@@ -616,12 +628,16 @@
                gsm0808_enc_aoip_trasp_addr(msg, ss);

        /* AoIP: Speech Codec (Chosen) 3.2.2.104 */
-       if (sc)
-               gsm0808_enc_speech_codec(msg, sc);
+       if (sc) {
+               if (gsm0808_enc_speech_codec2(msg, sc) < 0)
+                       goto exit_free;
+       }

        /* AoIP: add Codec List (BSS Supported) 3.2.2.103 */
-       if (scl)
-               gsm0808_enc_speech_codec_list(msg, scl);
+       if (scl) {
+               if (gsm0808_enc_speech_codec_list2(msg, scl) < 0)
+                       goto exit_free;
+       }

        /* FIXME: write LSA identifier 3.2.2.15 - see 3GPP TS 43.073 */

@@ -632,6 +648,10 @@
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP Assignment Completed message
@@ -693,13 +713,19 @@
        /* Circuit pool list 3.2.2.46 */

        /* AoIP: add Codec List (BSS Supported) 3.2.2.103 */
-       if (scl)
-               gsm0808_enc_speech_codec_list(msg, scl);
+       if (scl) {
+               if (gsm0808_enc_speech_codec_list2(msg, scl) < 0)
+                       goto exit_free;
+       }

        /* update the size */
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP Assignment Failure message
@@ -992,8 +1018,10 @@
        if (params->aoip_transport_layer)
                gsm0808_enc_aoip_trasp_addr(msg, params->aoip_transport_layer);

-       if (params->codec_list_msc_preferred)
-               gsm0808_enc_speech_codec_list(msg, 
params->codec_list_msc_preferred);
+       if (params->codec_list_msc_preferred) {
+               if (gsm0808_enc_speech_codec_list2(msg, 
params->codec_list_msc_preferred) < 0)
+                       goto exit_free;
+       }

        if (params->call_id_present) {
                uint8_t val[4];
@@ -1013,6 +1041,10 @@
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP HANDOVER REQUEST ACKNOWLEDGE message, 3GPP TS 48.008 
3.2.1.10.
@@ -1048,17 +1080,25 @@
        /* AoIP: add Codec List (BSS Supported) 3.2.2.103.
         * (codec_list_bss_supported was added to struct 
gsm0808_handover_request_ack later than speech_codec_chosen
         * below, but it needs to come before it in the message coding). */
-       if (params->more_items && params->codec_list_bss_supported.len)
-               gsm0808_enc_speech_codec_list(msg, 
&params->codec_list_bss_supported);
+       if (params->more_items && params->codec_list_bss_supported.len) {
+               if (gsm0808_enc_speech_codec_list2(msg, 
&params->codec_list_bss_supported) < 0)
+                       goto exit_free;
+       }

        /* AoIP: Speech Codec (Chosen) 3.2.2.104 */
-       if (params->speech_codec_chosen_present)
-               gsm0808_enc_speech_codec(msg, &params->speech_codec_chosen);
+       if (params->speech_codec_chosen_present) {
+               if (gsm0808_enc_speech_codec2(msg, 
&params->speech_codec_chosen) < 0)
+                       goto exit_free;
+       }

        /* prepend header with final length */
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Same as gsm0808_create_handover_request_ack2() but with less parameters.
@@ -1164,12 +1204,16 @@
                msgb_tlv_put(msg, GSM0808_IE_RR_CAUSE, 1, &params->rr_cause);

        /* AoIP: Speech Codec (Chosen) 3.2.2.104 */
-       if (params->speech_codec_chosen_present)
-               gsm0808_enc_speech_codec(msg, &params->speech_codec_chosen);
+       if (params->speech_codec_chosen_present) {
+               if (gsm0808_enc_speech_codec2(msg, 
&params->speech_codec_chosen) < 0)
+                       goto exit_free;
+       }

        /* AoIP: add Codec List (BSS Supported) 3.2.2.103 */
-       if (params->codec_list_bss_supported.len)
-               gsm0808_enc_speech_codec_list(msg, 
&params->codec_list_bss_supported);
+       if (params->codec_list_bss_supported.len) {
+               if (gsm0808_enc_speech_codec_list2(msg, 
&params->codec_list_bss_supported) < 0)
+                       goto exit_free;
+       }

        /* Chosen Encryption Algorithm 3.2.2.44 */
        if (params->chosen_encr_alg_present && params->chosen_encr_alg > 0)
@@ -1183,6 +1227,10 @@
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP HANDOVER FAILURE message, 3GPP TS 48.008 3.2.1.16.
@@ -1206,13 +1254,19 @@
                msgb_tlv_put(msg, GSM0808_IE_RR_CAUSE, 1, &params->rr_cause);

        /* AoIP: add Codec List (BSS Supported) 3.2.2.103 */
-       if (params->codec_list_bss_supported.len)
-               gsm0808_enc_speech_codec_list(msg, 
&params->codec_list_bss_supported);
+       if (params->codec_list_bss_supported.len) {
+               if (gsm0808_enc_speech_codec_list2(msg, 
&params->codec_list_bss_supported) < 0)
+                       goto exit_free;
+       }

        /* prepend header with final length */
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP HANDOVER PERFORMED message, 3GPP TS 48.008 3.2.1.25.
@@ -1248,8 +1302,10 @@
                msgb_tv_put(msg, GSM0808_IE_SPEECH_VERSION, 
params->speech_version_chosen);

        /* AoIP: Speech Codec (chosen) 3.2.2.104 */
-       if (params->speech_codec_chosen_present)
-               gsm0808_enc_speech_codec(msg, &params->speech_codec_chosen);
+       if (params->speech_codec_chosen_present) {
+               if (gsm0808_enc_speech_codec2(msg, 
&params->speech_codec_chosen) < 0)
+                       goto exit_free;
+       }

        /* LCLS-BSS-Status 3.2.2.119 */
        if (params->lcls_bss_status_present)
@@ -1259,6 +1315,10 @@
        msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, 
msgb_length(msg));

        return msg;
+
+exit_free:
+       msgb_free(msg);
+       return NULL;
 }

 /*! Create BSSMAP COMMON ID message, 3GPP TS 48.008 3.2.1.68.
diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c
index 2734f91..ab9f29b 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -959,7 +959,7 @@
        int rc_dec;

        msg = msgb_alloc(1024, "output buffer");
-       rc_enc = gsm0808_enc_speech_codec(msg, &enc_sc);
+       rc_enc = gsm0808_enc_speech_codec2(msg, &enc_sc);
        OSMO_ASSERT(rc_enc == 3);

        rc_dec = gsm0808_dec_speech_codec(&dec_sc, msg->data + 2, msg->len - 2);
@@ -985,7 +985,7 @@
        int rc_dec;

        msg = msgb_alloc(1024, "output buffer");
-       rc_enc = gsm0808_enc_speech_codec(msg, &enc_sc);
+       rc_enc = gsm0808_enc_speech_codec2(msg, &enc_sc);
        OSMO_ASSERT(rc_enc == 5);

        rc_dec = gsm0808_dec_speech_codec(&dec_sc, msg->data + 2, msg->len - 2);
@@ -1010,7 +1010,7 @@
        int rc_dec;

        msg = msgb_alloc(1024, "output buffer");
-       rc_enc = gsm0808_enc_speech_codec(msg, &enc_sc);
+       rc_enc = gsm0808_enc_speech_codec2(msg, &enc_sc);
        OSMO_ASSERT(rc_enc == 5);

        rc_dec = gsm0808_dec_speech_codec(&dec_sc, msg->data + 2, msg->len - 2);
@@ -1053,7 +1053,7 @@
        int rc_dec;

        msg = msgb_alloc(1024, "output buffer");
-       rc_enc = gsm0808_enc_speech_codec_list(msg, &enc_scl);
+       rc_enc = gsm0808_enc_speech_codec_list2(msg, &enc_scl);
        OSMO_ASSERT(rc_enc == 9);

        rc_dec = gsm0808_dec_speech_codec_list(&dec_scl, msg->data + 2, 
msg->len - 2);
@@ -1075,7 +1075,7 @@
        int rc_dec;

        msg = msgb_alloc(1024, "output buffer");
-       rc_enc = gsm0808_enc_speech_codec_list(msg, &enc_scl);
+       rc_enc = gsm0808_enc_speech_codec_list2(msg, &enc_scl);
        OSMO_ASSERT(rc_enc == 2);

        rc_dec = gsm0808_dec_speech_codec_list(&dec_scl, msg->data + 2, 
msg->len - 2);

--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/30580
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I28219b61b9347f0652f9fd0c717f6cdf3c63e8f9
Gerrit-Change-Number: 30580
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <[email protected]>
Gerrit-MessageType: newchange

Reply via email to