Browse Source

MT#55283 fix possible null pointer

Warned-by: Coverity
Change-Id: I8aed025badb050991fb9cadbdeb6c78036519965
pull/1848/head
Richard Fuchs 1 year ago
parent
commit
8c45a444fb
1 changed files with 29 additions and 19 deletions
  1. +29
    -19
      daemon/call_interfaces.c

+ 29
- 19
daemon/call_interfaces.c View File

@ -2335,12 +2335,16 @@ err:
return NULL;
}
static void ng_stats(const ng_parser_t *parser, parser_arg d, const struct stream_stats *s,
static void ng_stats(ng_parser_ctx_t *ctx, parser_arg dict, const char *dict_name,
const struct stream_stats *s,
struct stream_stats *totals)
{
parser->dict_add_int(d, "packets", atomic64_get_na(&s->packets));
parser->dict_add_int(d, "bytes", atomic64_get_na(&s->bytes));
parser->dict_add_int(d, "errors", atomic64_get_na(&s->errors));
if (ctx) {
parser_arg d = ctx->parser->dict_add_dict(dict, dict_name);
ctx->parser->dict_add_int(d, "packets", atomic64_get_na(&s->packets));
ctx->parser->dict_add_int(d, "bytes", atomic64_get_na(&s->bytes));
ctx->parser->dict_add_int(d, "errors", atomic64_get_na(&s->errors));
}
if (!totals)
return;
atomic64_add_na(&totals->packets, atomic64_get(&s->packets));
@ -2379,15 +2383,17 @@ static void ng_stats_stream_ssrc(const ng_parser_t *parser, parser_arg dict,
#define BF_PS(k, f) if (PS_ISSET(ps, f)) parser->list_add_string(flags, k)
static void ng_stats_stream(const ng_parser_t *parser, parser_arg list, const struct packet_stream *ps,
static void ng_stats_stream(ng_parser_ctx_t *ctx, parser_arg list, const struct packet_stream *ps,
struct call_stats *totals)
{
parser_arg dict = {0}, flags;
struct stream_stats *s;
if (!list.gen)
if (!ctx)
goto stats;
const ng_parser_t *parser = ctx->parser;
dict = parser->list_add_dict(list);
if (ps->selected_sfd) {
@ -2431,22 +2437,24 @@ stats:
s = &totals->totals[0];
if (!PS_ISSET(ps, RTP))
s = &totals->totals[1];
ng_stats(parser, parser->dict_add_dict(dict, "stats"), ps->stats_in, s);
ng_stats(parser, parser->dict_add_dict(dict, "stats_out"), ps->stats_out, NULL);
ng_stats(ctx, dict, "stats", ps->stats_in, s);
ng_stats(ctx, dict, "stats_out", ps->stats_out, NULL);
}
#define BF_M(k, f) if (MEDIA_ISSET(m, f)) parser->list_add_string(flags, k)
static void ng_stats_media(const ng_parser_t *parser, parser_arg list, const struct call_media *m,
static void ng_stats_media(ng_parser_ctx_t *ctx, parser_arg list, const struct call_media *m,
struct call_stats *totals)
{
parser_arg dict, streams = {0}, flags;
struct packet_stream *ps;
const rtp_payload_type *rtp_pt = NULL;
if (!list.gen)
if (!ctx)
goto stats;
const ng_parser_t *parser = ctx->parser;
rtp_pt = __rtp_stats_codec((struct call_media *)m);
dict = parser->list_add_dict(list);
@ -2495,11 +2503,11 @@ static void ng_stats_media(const ng_parser_t *parser, parser_arg list, const str
stats:
for (auto_iter(l, m->streams.head); l; l = l->next) {
ps = l->data;
ng_stats_stream(parser, streams, ps, totals);
ng_stats_stream(ctx, streams, ps, totals);
}
}
static void ng_stats_monologue(const ng_parser_t *parser, parser_arg dict, const struct call_monologue *ml,
static void ng_stats_monologue(ng_parser_ctx_t *ctx, parser_arg dict, const struct call_monologue *ml,
struct call_stats *totals, parser_arg ssrc)
{
parser_arg sub, medias = {0};
@ -2510,9 +2518,11 @@ static void ng_stats_monologue(const ng_parser_t *parser, parser_arg dict, const
if (!ml)
return;
if (!dict.gen)
if (!ctx)
goto stats;
const ng_parser_t *parser = ctx->parser;
if (ml->tag.len)
sub = parser->dict_add_dict(dict, ml->tag.s);
else {
@ -2590,7 +2600,7 @@ stats:
m = ml->medias->pdata[i];
if (!m)
continue;
ng_stats_media(parser, medias, m, totals);
ng_stats_media(ctx, medias, m, totals);
}
}
@ -2705,13 +2715,13 @@ stats:
if (!match_tag || !match_tag->len) {
for (__auto_type l = call->monologues.head; l; l = l->next) {
ml = l->data;
ng_stats_monologue(ctx->parser, tags, ml, totals, ssrc);
ng_stats_monologue(ctx, tags, ml, totals, ssrc);
}
}
else {
ml = call_get_monologue(call, match_tag);
if (ml) {
ng_stats_monologue(ctx->parser, tags, ml, totals, ssrc);
ng_stats_monologue(ctx, tags, ml, totals, ssrc);
g_auto(GQueue) mls = G_QUEUE_INIT; /* to avoid duplications */
for (int i = 0; i < ml->medias->len; i++)
{
@ -2725,7 +2735,7 @@ stats:
{
struct media_subscription * ms = subscription->data;
if (!g_queue_find(&mls, ms->monologue)) {
ng_stats_monologue(ctx->parser, tags, ms->monologue, totals, ssrc);
ng_stats_monologue(ctx, tags, ms->monologue, totals, ssrc);
g_queue_push_tail(&mls, ms->monologue);
}
}
@ -2737,8 +2747,8 @@ stats:
return;
dict = ctx->parser->dict_add_dict(ctx->resp, "totals");
ng_stats(ctx->parser, ctx->parser->dict_add_dict(dict, "RTP"), &totals->totals[0], NULL);
ng_stats(ctx->parser, ctx->parser->dict_add_dict(dict, "RTCP"), &totals->totals[1], NULL);
ng_stats(ctx, dict, "RTP", &totals->totals[0], NULL);
ng_stats(ctx, dict, "RTCP", &totals->totals[1], NULL);
if (call->recording) {
parser_arg rec = ctx->parser->dict_add_dict(ctx->resp, "recording");


Loading…
Cancel
Save