handle NULL return of rate_ctr_group_alloc()
Change-Id: Ieadded9c088ef8f86164400a60ce542e3c868e9d
Related: OS#3701
diff --git a/src/libosmo-mgcp/mgcp_conn.c b/src/libosmo-mgcp/mgcp_conn.c
index af5426f..5300351 100644
--- a/src/libosmo-mgcp/mgcp_conn.c
+++ b/src/libosmo-mgcp/mgcp_conn.c
@@ -81,7 +81,7 @@
}
/* Initialize rtp connection struct with default values */
-static void mgcp_rtp_conn_init(struct mgcp_conn_rtp *conn_rtp, struct mgcp_conn *conn)
+static int mgcp_rtp_conn_init(struct mgcp_conn_rtp *conn_rtp, struct mgcp_conn *conn)
{
struct mgcp_rtp_end *end = &conn_rtp->end;
/* FIXME: Each new rate counter group requires an unique index. At the
@@ -109,12 +109,17 @@
end->maximum_packet_time = -1;
conn_rtp->rate_ctr_group = rate_ctr_group_alloc(conn, &rate_ctr_group_desc, rate_ctr_index);
+ if (!conn_rtp->rate_ctr_group)
+ return -1;
+
conn_rtp->state.in_stream.err_ts_ctr = &conn_rtp->rate_ctr_group->ctr[IN_STREAM_ERR_TSTMP_CTR];
conn_rtp->state.out_stream.err_ts_ctr = &conn_rtp->rate_ctr_group->ctr[OUT_STREAM_ERR_TSTMP_CTR];
rate_ctr_index++;
/* Make sure codec table is reset */
mgcp_codec_reset_all(conn_rtp);
+
+ return 0;
}
/* Cleanup rtp connection struct */
@@ -175,7 +180,10 @@
switch (type) {
case MGCP_CONN_TYPE_RTP:
- mgcp_rtp_conn_init(&conn->u.rtp, conn);
+ if (mgcp_rtp_conn_init(&conn->u.rtp, conn) < 0) {
+ talloc_free(conn);
+ return NULL;
+ }
break;
default:
/* NOTE: This should never be called with an
diff --git a/src/libosmo-mgcp/mgcp_protocol.c b/src/libosmo-mgcp/mgcp_protocol.c
index 3a4e396..807e34a 100644
--- a/src/libosmo-mgcp/mgcp_protocol.c
+++ b/src/libosmo-mgcp/mgcp_protocol.c
@@ -1496,7 +1496,7 @@
return 0;
}
-static void alloc_mgcp_rate_counters(struct mgcp_trunk_config *trunk, void *ctx)
+static int alloc_mgcp_rate_counters(struct mgcp_trunk_config *trunk, void *ctx)
{
/* FIXME: Each new rate counter group requires a unique index. At the
* moment we generate an index using a counter, but perhaps there is
@@ -1508,25 +1508,34 @@
if (trunk->mgcp_crcx_ctr_group == NULL) {
trunk->mgcp_crcx_ctr_group = rate_ctr_group_alloc(ctx, &mgcp_crcx_ctr_group_desc, crcx_rate_ctr_index);
+ if (!trunk->mgcp_crcx_ctr_group)
+ return -1;
talloc_set_destructor(trunk->mgcp_crcx_ctr_group, free_rate_counter_group);
crcx_rate_ctr_index++;
}
if (trunk->mgcp_mdcx_ctr_group == NULL) {
trunk->mgcp_mdcx_ctr_group = rate_ctr_group_alloc(ctx, &mgcp_mdcx_ctr_group_desc, mdcx_rate_ctr_index);
+ if (!trunk->mgcp_mdcx_ctr_group)
+ return -1;
talloc_set_destructor(trunk->mgcp_mdcx_ctr_group, free_rate_counter_group);
mdcx_rate_ctr_index++;
}
if (trunk->mgcp_dlcx_ctr_group == NULL) {
trunk->mgcp_dlcx_ctr_group = rate_ctr_group_alloc(ctx, &mgcp_dlcx_ctr_group_desc, dlcx_rate_ctr_index);
+ if (!trunk->mgcp_dlcx_ctr_group)
+ return -1;
talloc_set_destructor(trunk->mgcp_dlcx_ctr_group, free_rate_counter_group);
dlcx_rate_ctr_index++;
}
if (trunk->all_rtp_conn_stats == NULL) {
trunk->all_rtp_conn_stats = rate_ctr_group_alloc(ctx, &all_rtp_conn_rate_ctr_group_desc,
all_rtp_conn_rate_ctr_index);
+ if (!trunk->all_rtp_conn_stats)
+ return -1;
talloc_set_destructor(trunk->all_rtp_conn_stats, free_rate_counter_group);
all_rtp_conn_rate_ctr_index++;
}
+ return 0;
}
/*! allocate configuration with default values.
@@ -1566,7 +1575,10 @@
cfg->trunk.audio_send_name = 1;
cfg->trunk.omit_rtcp = 0;
mgcp_trunk_set_keepalive(&cfg->trunk, MGCP_KEEPALIVE_ONCE);
- alloc_mgcp_rate_counters(&cfg->trunk, cfg);
+ if (alloc_mgcp_rate_counters(&cfg->trunk, cfg) < 0) {
+ talloc_free(cfg);
+ return NULL;
+ }
INIT_LLIST_HEAD(&cfg->trunks);