From 5a2a7d65b5f55774c8a7149ddd34055193f3d7f3 Mon Sep 17 00:00:00 2001 From: Sungtae Kim Date: Wed, 5 Dec 2018 23:09:49 +0100 Subject: [PATCH] main/cdr: Fixed cdr start overwriting The CDR was overwriting the start time when the call continued the dialplan from the ARI stasis or a Local channel was originated. This change fixes this by no longer reinitializing the CDR when transitioning out of the dialed pending state to the single state. ASTERISK-28181 Change-Id: I921bc04064b6cff1deb2eea56a94d86489561cdc --- main/cdr.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/main/cdr.c b/main/cdr.c index 462c3e6a2f..53f3362827 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -795,6 +795,23 @@ static void cdr_object_snapshot_copy(struct cdr_object_snapshot *dst, struct cdr copy_variables(&dst->variables, &src->variables); } +/*! + * \brief Transition a \ref cdr_object to a new state with initiation flag + * \param cdr The \ref cdr_object to transition + * \param fn_table The \ref cdr_object_fn_table state to go to + */ +static void cdr_object_transition_state_init(struct cdr_object *cdr, struct cdr_object_fn_table *fn_table, int do_init) +{ + CDR_DEBUG("%p - Transitioning CDR for %s from state %s to %s\n", + cdr, cdr->party_a.snapshot->base->name, + cdr->fn_table ? cdr->fn_table->name : "NONE", fn_table->name); + cdr->fn_table = fn_table; + + if (cdr->fn_table->init_function && do_init) { + cdr->fn_table->init_function(cdr); + } +} + /*! * \brief Transition a \ref cdr_object to a new state * \param cdr The \ref cdr_object to transition @@ -802,13 +819,7 @@ static void cdr_object_snapshot_copy(struct cdr_object_snapshot *dst, struct cdr */ static void cdr_object_transition_state(struct cdr_object *cdr, struct cdr_object_fn_table *fn_table) { - CDR_DEBUG("%p - Transitioning CDR for %s from state %s to %s\n", - cdr, cdr->party_a.snapshot->base->name, - cdr->fn_table ? cdr->fn_table->name : "NONE", fn_table->name); - cdr->fn_table = fn_table; - if (cdr->fn_table->init_function) { - cdr->fn_table->init_function(cdr); - } + cdr_object_transition_state_init(cdr, fn_table, 1); } /*! @@ -1944,7 +1955,12 @@ static int dialed_pending_state_process_party_a(struct cdr_object *cdr, struct a cdr->fn_table->process_party_a(cdr, snapshot); return 1; } else { - cdr_object_transition_state(cdr, &single_state_fn_table); + /* The CDR does not need to be reinitialized when transitioning + * to its single state as this would overwrite the start time, + * causing potentially both the answer and the start time to be + * the same which is incorrect. + */ + cdr_object_transition_state_init(cdr, &single_state_fn_table, 0); cdr->fn_table->process_party_a(cdr, snapshot); return 0; }