diff --git a/apps/app_queue.c b/apps/app_queue.c index 6d893f56d2..5e7289ae06 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -3050,11 +3050,18 @@ struct queue_transfer_ds { int starttime; }; +static void queue_transfer_destroy(void *data) +{ + struct queue_transfer_ds *qtds = data; + ast_free(qtds); +} + /*! \brief a datastore used to help correctly log attended transfers of queue callers */ static const struct ast_datastore_info queue_transfer_info = { .type = "queue_transfer", .chan_fixup = queue_transfer_fixup, + .destroy = queue_transfer_destroy, }; /*! \brief Log an attended transfer when a queue caller channel is masqueraded @@ -3102,7 +3109,12 @@ static int attended_transfer_occurred(struct ast_channel *chan) static void setup_transfer_datastore(struct queue_ent *qe, struct member *member, int starttime) { struct ast_datastore *ds; - struct queue_transfer_ds qtds; + struct queue_transfer_ds *qtds = ast_calloc(1, sizeof(qtds)); + + if (!qtds) { + ast_log(LOG_WARNING, "Memory allocation error!\n"); + return; + } ast_channel_lock(qe->chan); if (!(ds = ast_channel_datastore_alloc(&queue_transfer_info, NULL))) { @@ -3111,11 +3123,11 @@ static void setup_transfer_datastore(struct queue_ent *qe, struct member *member return; } - qtds.qe = qe; + qtds->qe = qe; /* This member is refcounted in try_calling, so no need to add it here, too */ - qtds.member = member; - qtds.starttime = starttime; - ds->data = &qtds; + qtds->member = member; + qtds->starttime = starttime; + ds->data = qtds; ast_channel_datastore_add(qe->chan, ds); ast_channel_unlock(qe->chan); }