It seems that one can crash asterisk+visdn by sending a SETUP message
without a Bearer Capability information element.

While that is definitely not legal, it's not a good reason to crash either.

diff --git a/chan_visdn/chan_visdn.c b/chan_visdn/chan_visdn.c
index 977e13a..27cabab 100644
--- a/chan_visdn/chan_visdn.c
+++ b/chan_visdn/chan_visdn.c
@@ -3338,7 +3338,24 @@ static void visdn_q931_setup_indication(
                }
        }

-       assert(bc);
+    if(!bc) {
+        visdn_debug("Missing bearer capability, rejecting call\n");
+
+        Q931_DECLARE_IES(ies);
+
+        struct q931_ie_cause *cause = q931_ie_cause_alloc();
+        cause->coding_standard = Q931_IE_C_CS_CCITT;
+        cause->location = q931_ie_cause_location_call(q931_call);
+        cause->value = Q931_IE_C_CV_MANDATORY_INFORMATION_ELEMENT_IS_MISSING;
+        q931_ies_add_put(&ies, &cause->ie);
+
+        q931_send_primitive(visdn_chan->q931_call,
+            Q931_CCB_REJECT_REQUEST, &ies);
+
+        Q931_UNDECLARE_IES(ies);
+
+        goto err_bearercap;
+    }

        q931_call->pvt = ast_chan;

@@ -3435,7 +3452,7 @@ static void visdn_q931_setup_indication(

                Q931_UNDECLARE_IES(ies);

-               goto err_unsupported_bearercap;
+               goto err_bearercap;
        }

        /* ------ Handle HLC ------ */
@@ -3708,7 +3725,7 @@ #endif

        return;

-err_unsupported_bearercap:
+err_bearercap:
        ast_hangup(ast_chan);
        goto err_visdn_alloc; // FIXME, ast_hangup frees visdn_chan too
 err_visdn_new:

-- 
Matthias Urlichs   |   {M:U} IT Design @ m-u-it.de   |  [EMAIL PROTECTED]
Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de
 - -
In unanimity there is cowardice and uncritical thinking.
                                        -- Marion J. Levy, Jr.

_______________________________________________
Visdn-hackers mailing list
[email protected]
https://mailman.uli.it/mailman/listinfo/visdn-hackers

Reply via email to