[Asterisk-code-review] chan rtp.c: Cleanup ast request() parameter parsing. (asterisk[master])
Joshua Colp
asteriskteam at digium.com
Mon May 23 16:17:57 CDT 2016
Joshua Colp has submitted this change and it was merged.
Change subject: chan_rtp.c: Cleanup ast_request() parameter parsing.
......................................................................
chan_rtp.c: Cleanup ast_request() parameter parsing.
* Fixed NULL crash potential if parameters are missing.
* Reordered some operations so further diagnostic messages can be
more helpful.
Change-Id: Ibbdc67a2496508cbfbfef0cf19c35177ae2fbd70
---
M channels/chan_rtp.c
1 file changed, 60 insertions(+), 26 deletions(-)
Approvals:
Matthew Fredrickson: Looks good to me, approved
Joshua Colp: Looks good to me, but someone else must approve; Verified
diff --git a/channels/chan_rtp.c b/channels/chan_rtp.c
index 04eb0b1..56705b1 100644
--- a/channels/chan_rtp.c
+++ b/channels/chan_rtp.c
@@ -141,19 +141,32 @@
parse = ast_strdupa(data);
AST_NONSTANDARD_APP_ARGS(args, parse, '/');
- fmt = ast_format_cap_get_format(cap, 0);
+ if (ast_strlen_zero(args.type)) {
+ ast_log(LOG_ERROR, "Type is required for the 'MulticastRTP' channel\n");
+ goto failure;
+ }
+
+ if (ast_strlen_zero(args.destination)) {
+ ast_log(LOG_ERROR, "Destination is required for the 'MulticastRTP' channel\n");
+ goto failure;
+ }
+ if (!ast_sockaddr_parse(&destination_address, args.destination, PARSE_PORT_REQUIRE)) {
+ ast_log(LOG_ERROR, "Destination address '%s' could not be parsed\n",
+ args.destination);
+ goto failure;
+ }
ast_sockaddr_setnull(&control_address);
-
- if (!ast_strlen_zero(args.control) &&
- !ast_sockaddr_parse(&control_address, args.control, PARSE_PORT_REQUIRE)) {
+ if (!ast_strlen_zero(args.control)
+ && !ast_sockaddr_parse(&control_address, args.control, PARSE_PORT_REQUIRE)) {
ast_log(LOG_ERROR, "Control address '%s' could not be parsed\n", args.control);
goto failure;
}
- if (!ast_sockaddr_parse(&destination_address, args.destination,
- PARSE_PORT_REQUIRE)) {
- ast_log(LOG_ERROR, "Destination address '%s' could not be parsed\n", args.destination);
+ fmt = ast_format_cap_get_format(cap, 0);
+ if (!fmt) {
+ ast_log(LOG_ERROR, "No format available for sending RTP to '%s'\n",
+ args.destination);
goto failure;
}
@@ -162,12 +175,17 @@
goto failure;
}
- if (!(instance = ast_rtp_instance_new("multicast", NULL, &control_address, args.type))) {
- ast_log(LOG_ERROR, "Could not create RTP instance for sending media to '%s'\n", args.destination);
+ instance = ast_rtp_instance_new("multicast", NULL, &control_address, args.type);
+ if (!instance) {
+ ast_log(LOG_ERROR,
+ "Could not create '%s' multicast RTP instance for sending media to '%s'\n",
+ args.type, args.destination);
goto failure;
}
- if (!(chan = ast_channel_alloc(1, AST_STATE_DOWN, "", "", "", "", "", assignedids, requestor, 0, "MulticastRTP/%p", instance))) {
+ chan = ast_channel_alloc(1, AST_STATE_DOWN, "", "", "", "", "", assignedids,
+ requestor, 0, "MulticastRTP/%p", instance);
+ if (!chan) {
ast_rtp_instance_destroy(instance);
goto failure;
}
@@ -216,26 +234,35 @@
);
if (ast_strlen_zero(data)) {
+ ast_log(LOG_ERROR, "Destination is required for the 'UnicastRTP' channel\n");
goto failure;
}
parse = ast_strdupa(data);
AST_NONSTANDARD_APP_ARGS(args, parse, '/');
- if (!ast_strlen_zero(args.format)) {
- fmt = ast_format_cache_get(args.format);
- } else {
- fmt = ast_format_cap_get_format(cap, 0);
- }
-
- if (!fmt) {
- ast_log(LOG_ERROR, "No format specified for sending RTP to '%s'\n", args.destination);
+ if (ast_strlen_zero(args.destination)) {
+ ast_log(LOG_ERROR, "Destination is required for the 'UnicastRTP' channel\n");
goto failure;
}
-
- if (!ast_sockaddr_parse(&address, args.destination,
- PARSE_PORT_REQUIRE)) {
+ if (!ast_sockaddr_parse(&address, args.destination, PARSE_PORT_REQUIRE)) {
ast_log(LOG_ERROR, "Destination '%s' could not be parsed\n", args.destination);
goto failure;
+ }
+
+ if (!ast_strlen_zero(args.format)) {
+ fmt = ast_format_cache_get(args.format);
+ if (!fmt) {
+ ast_log(LOG_ERROR, "Format '%s' not found for sending RTP to '%s'\n",
+ args.format, args.destination);
+ goto failure;
+ }
+ } else {
+ fmt = ast_format_cap_get_format(cap, 0);
+ if (!fmt) {
+ ast_log(LOG_ERROR, "No format available for sending RTP to '%s'\n",
+ args.destination);
+ goto failure;
+ }
}
caps = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT);
@@ -244,12 +271,17 @@
}
ast_ouraddrfor(&address, &local_address);
- if (!(instance = ast_rtp_instance_new(args.engine, NULL, &local_address, NULL))) {
- ast_log(LOG_ERROR, "Could not create RTP instance for sending media to '%s'\n", args.destination);
+ instance = ast_rtp_instance_new(args.engine, NULL, &local_address, NULL);
+ if (!instance) {
+ ast_log(LOG_ERROR,
+ "Could not create %s RTP instance for sending media to '%s'\n",
+ S_OR(args.engine, "default"), args.destination);
goto failure;
}
- if (!(chan = ast_channel_alloc(1, AST_STATE_DOWN, "", "", "", "", "", assignedids, requestor, 0, "UnicastRTP/%s-%p", args.destination, instance))) {
+ chan = ast_channel_alloc(1, AST_STATE_DOWN, "", "", "", "", "", assignedids,
+ requestor, 0, "UnicastRTP/%s-%p", args.destination, instance);
+ if (!chan) {
ast_rtp_instance_destroy(instance);
goto failure;
}
@@ -268,9 +300,11 @@
ast_channel_tech_pvt_set(chan, instance);
- pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_ADDRESS", ast_sockaddr_stringify_addr(&local_address));
+ pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_ADDRESS",
+ ast_sockaddr_stringify_addr(&local_address));
ast_rtp_instance_get_local_address(instance, &local_address);
- pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_PORT", ast_sockaddr_stringify_port(&local_address));
+ pbx_builtin_setvar_helper(chan, "UNICASTRTP_LOCAL_PORT",
+ ast_sockaddr_stringify_port(&local_address));
ast_channel_unlock(chan);
--
To view, visit https://gerrit.asterisk.org/2889
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Ibbdc67a2496508cbfbfef0cf19c35177ae2fbd70
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Richard Mudgett <rmudgett at digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Matthew Fredrickson <creslin at digium.com>
More information about the asterisk-code-review
mailing list