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
pull/13/head
Dömsödi Gergely 6 years ago committed by Joshua C. Colp
parent 4114c2bc3c
commit 48e407e506

@ -4497,6 +4497,7 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
char tech[256]; char tech[256];
char *location; char *location;
const char *macrocontext, *macroexten; const char *macrocontext, *macroexten;
struct ast_format_cap *nativeformats;
RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref); RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
/* on entry here, we know that tmp->chan == NULL */ /* 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 = ""; location = "";
} }
ast_channel_lock(qe->chan);
nativeformats = ao2_bump(ast_channel_nativeformats(qe->chan));
ast_channel_unlock(qe->chan);
/* Request the peer */ /* 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 */ if (!tmp->chan) { /* If we can't, just go on to the next call */
ao2_lock(qe->parent); ao2_lock(qe->parent);
qe->parent->rrpos++; qe->parent->rrpos++;

Loading…
Cancel
Save