From: Dömsödi Gergely Date: Wed, 6 Mar 2019 13:20:09 +0000 (+0100) Subject: app_queue: fix ring_entry to access nativeformats with a channel lock X-Git-Tag: 16.3.0-rc1~21^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e7dd4bd4a9f9234b0415faf13f91588d08edaf4b;p=thirdparty%2Fasterisk.git app_queue: fix ring_entry to access nativeformats with a channel lock Fixes an intermittent segmentation fault which occured when accessing nativeformats of a channel which entered into a queue. ASTERISK-27964 Reported by: Francisco Seratti Change-Id: Ic87fa7a363f3b487c24ce07032f4b2201c22db9e --- diff --git a/apps/app_queue.c b/apps/app_queue.c index f441e35c30..132621dd53 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -4497,6 +4497,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies char tech[256]; char *location; const char *macrocontext, *macroexten; + struct ast_format_cap *nativeformats; RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref); /* on entry here, we know that tmp->chan == NULL */ @@ -4513,8 +4514,13 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies location = ""; } + ast_channel_lock(qe->chan); + nativeformats = ao2_bump(ast_channel_nativeformats(qe->chan)); + ast_channel_unlock(qe->chan); + /* Request the peer */ - tmp->chan = ast_request(tech, ast_channel_nativeformats(qe->chan), NULL, qe->chan, location, &status); + tmp->chan = ast_request(tech, nativeformats, NULL, qe->chan, location, &status); + ao2_cleanup(nativeformats); if (!tmp->chan) { /* If we can't, just go on to the next call */ ao2_lock(qe->parent); qe->parent->rrpos++;