diff -Naur asterisk-issue14068-2009-01-30/channels/chan_dahdi.c asterisk-issue14068-2009-01-30.new/channels/chan_dahdi.c --- asterisk-issue14068-2009-01-30/channels/chan_dahdi.c 2009-01-30 14:16:34.000000000 +0100 +++ asterisk-issue14068-2009-01-30.new/channels/chan_dahdi.c 2009-01-30 15:45:02.000000000 +0100 @@ -11660,27 +11660,6 @@ dahdi_queue_frame(pri->pvts[chanpos], &f, pri); } } - if (pri->pvts[chanpos]->owner) { - char dnid[AST_MAX_EXTENSION]; - char rdnis[AST_MAX_EXTENSION]; - if (pri->pvts[chanpos]->owner->exten) { - int pos = strlen(pri->pvts[chanpos]->owner->exten); - if (pos < sizeof(pri->pvts[chanpos]->owner->exten) - 2) - ast_copy_string(&pri->pvts[chanpos]->owner->exten[pos], e->ring.callednum, sizeof(pri->pvts[chanpos]->owner->exten) - strlen(e->ring.callednum)); - } - if (pri->pvts[chanpos]->owner->cid.cid_dnid) { - ast_copy_string(dnid, pri->pvts[chanpos]->owner->cid.cid_dnid, sizeof(dnid)); - strncat (dnid, e->ring.callednum, sizeof(dnid) - strlen(dnid) - 1); - ast_free(pri->pvts[chanpos]->owner->cid.cid_dnid); - pri->pvts[chanpos]->owner->cid.cid_dnid = ast_strdup(dnid); - } - if (pri->pvts[chanpos]->owner->cid.cid_rdnis) { - ast_copy_string(rdnis, pri->pvts[chanpos]->owner->cid.cid_rdnis, sizeof(rdnis)); - strncat (rdnis, e->ring.callednum, sizeof(rdnis) - strlen(rdnis) - 1); - ast_free(pri->pvts[chanpos]->owner->cid.cid_rdnis); - pri->pvts[chanpos]->owner->cid.cid_rdnis = ast_strdup(rdnis); - } - } } ast_mutex_unlock(&pri->pvts[chanpos]->lock); } @@ -11709,6 +11688,27 @@ dahdi_queue_frame(pri->pvts[chanpos], &f, pri); } } + if (pri->pvts[chanpos]->owner) { + char dnid[AST_MAX_EXTENSION]; + char rdnis[AST_MAX_EXTENSION]; + if (pri->pvts[chanpos]->owner->exten) { + int pos = strlen(pri->pvts[chanpos]->owner->exten); + if (pos < sizeof(pri->pvts[chanpos]->owner->exten) - 2) + ast_copy_string(&pri->pvts[chanpos]->owner->exten[pos], e->ring.callednum, sizeof(pri->pvts[chanpos]->owner->exten) - strlen(e->ring.callednum)); + } + if (pri->pvts[chanpos]->owner->cid.cid_dnid) { + ast_copy_string(dnid, pri->pvts[chanpos]->owner->cid.cid_dnid, sizeof(dnid)); + strncat (dnid, e->ring.callednum, sizeof(dnid) - strlen(dnid) - 1); + ast_free(pri->pvts[chanpos]->owner->cid.cid_dnid); + pri->pvts[chanpos]->owner->cid.cid_dnid = ast_strdup(dnid); + } + if (pri->pvts[chanpos]->owner->cid.cid_rdnis) { + ast_copy_string(rdnis, pri->pvts[chanpos]->owner->cid.cid_rdnis, sizeof(rdnis)); + strncat (rdnis, e->ring.callednum, sizeof(rdnis) - strlen(rdnis) - 1); + ast_free(pri->pvts[chanpos]->owner->cid.cid_rdnis); + pri->pvts[chanpos]->owner->cid.cid_rdnis = ast_strdup(rdnis); + } + } } ast_mutex_unlock(&pri->pvts[chanpos]->lock); } @@ -12026,9 +12026,8 @@ } #endif - if (e->ringing.calledname[0] || e->ringing.callednum[0]) { + if ((e->ringing.calledname[0] || e->ringing.callednum[0]) && pri->pvts[chanpos]->owner) { struct ast_party_connected_line connected; - struct ast_channel *owner = pri->pvts[chanpos]->owner; /* Update the connected line information on the other channel */ ast_party_connected_line_init(&connected); @@ -12037,7 +12036,7 @@ connected.id.number_type = e->ringing.calledplan; connected.id.number_presentation = pri_to_ast_presentation(e->ringing.calledpres); connected.source = AST_CONNECTED_LINE_UPDATE_SOURCE_ANSWER; - ast_queue_connected_line_update(owner, &connected); + ast_queue_connected_line_update(pri->pvts[chanpos]->owner, &connected); } ast_mutex_unlock(&pri->pvts[chanpos]->lock); @@ -12165,44 +12164,48 @@ switch (subcmd->cmd) { case CMD_CONNECTEDLINE: { - struct ast_party_connected_line connected; - cmd_connectedline *cmdcl; struct ast_channel *owner = pri->pvts[chanpos]->owner; + if (owner) { + struct ast_party_connected_line connected; + cmd_connectedline *cmdcl; + + /* Update the connected line information on the other channel */ + ast_party_connected_line_init(&connected); + cmdcl = &subcmd->connectedline; + connected.id.number = cmdcl->connected.id.number; + connected.id.name = cmdcl->connected.id.name; + connected.id.number_type = cmdcl->connected.id.number_type; + connected.id.number_presentation = pri_to_ast_presentation(cmdcl->connected.id.number_presentation); + connected.source = pri_to_ast_connected_line_update_source(cmdcl->connected.source); + ast_queue_connected_line_update(owner, &connected); - /* Update the connected line information on the other channel */ - ast_party_connected_line_init(&connected); - cmdcl = &subcmd->connectedline; - connected.id.number = cmdcl->connected.id.number; - connected.id.name = cmdcl->connected.id.name; - connected.id.number_type = cmdcl->connected.id.number_type; - connected.id.number_presentation = pri_to_ast_presentation(cmdcl->connected.id.number_presentation); - connected.source = pri_to_ast_connected_line_update_source(cmdcl->connected.source); - ast_queue_connected_line_update(owner, &connected); + ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->connected.id.number, sizeof(pri->pvts[chanpos]->lastcid_num)); + ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->connected.id.name, sizeof(pri->pvts[chanpos]->lastcid_name)); - ast_copy_string(pri->pvts[chanpos]->lastcid_num, cmdcl->connected.id.number, sizeof(pri->pvts[chanpos]->lastcid_num)); - ast_copy_string(pri->pvts[chanpos]->lastcid_name, cmdcl->connected.id.name, sizeof(pri->pvts[chanpos]->lastcid_name)); - - pri->pvts[chanpos]->subs[SUB_REAL].needcallerid =1; + pri->pvts[chanpos]->subs[SUB_REAL].needcallerid =1; + } } break; case CMD_REDIRECTING: { - struct ast_party_redirecting redirecting = {{0,},}; - cmd_redirecting *cmdr; struct ast_channel *owner = pri->pvts[chanpos]->owner; - - cmdr = &subcmd->redirecting; - redirecting.from.number = cmdr->redirecting.from.number; - redirecting.from.name = cmdr->redirecting.from.name; - redirecting.from.number_type = cmdr->redirecting.from.number_type; - redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->redirecting.from.number_presentation); - redirecting.to.number = cmdr->redirecting.to.number; - redirecting.to.name = cmdr->redirecting.to.name; - redirecting.to.number_type = cmdr->redirecting.to.number_type; - redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->redirecting.to.number_presentation); - redirecting.count = 0; - redirecting.reason = pri_to_ast_reason(cmdr->redirecting.reason); - ast_queue_redirecting_update(owner, &redirecting); + if (owner) { + struct ast_party_redirecting redirecting = {{0,},}; + cmd_redirecting *cmdr; + + cmdr = &subcmd->redirecting; + redirecting.from.number = cmdr->redirecting.from.number; + redirecting.from.name = cmdr->redirecting.from.name; + redirecting.from.number_type = cmdr->redirecting.from.number_type; + redirecting.from.number_presentation = pri_to_ast_presentation(cmdr->redirecting.from.number_presentation); + redirecting.to.number = cmdr->redirecting.to.number; + redirecting.to.name = cmdr->redirecting.to.name; + redirecting.to.number_type = cmdr->redirecting.to.number_type; + redirecting.to.number_presentation = pri_to_ast_presentation(cmdr->redirecting.to.number_presentation); + redirecting.count = 0; + redirecting.reason = pri_to_ast_reason(cmdr->redirecting.reason); + ast_queue_redirecting_update(owner, &redirecting); + } } break; default: @@ -12227,7 +12230,7 @@ PRI_SPAN(e->answer.channel), PRI_CHANNEL(e->answer.channel), pri->span); } else { struct ast_party_connected_line connected; - struct ast_channel *owner = pri->pvts[chanpos]->owner; + struct ast_channel *owner; ast_mutex_lock(&pri->pvts[chanpos]->lock); /* Now we can do call progress detection */ @@ -12267,23 +12270,25 @@ dahdi_enable_ec(pri->pvts[chanpos]); } + owner = pri->pvts[chanpos]->owner; #ifdef SUPPORT_USERUSER if (!ast_strlen_zero(e->answer.useruserinfo)) { - struct ast_channel *owner = pri->pvts[chanpos]->owner; ast_mutex_unlock(&pri->pvts[chanpos]->lock); pbx_builtin_setvar_helper(owner, "USERUSERINFO", e->answer.useruserinfo); ast_mutex_lock(&pri->pvts[chanpos]->lock); } #endif - /* Update the connected line information on the other channel */ - ast_party_connected_line_init(&connected); - connected.id.name = e->answer.connectedname; - connected.id.number = e->answer.connectednum; - connected.id.number_type = e->answer.connectedplan; - connected.id.number_presentation = pri_to_ast_presentation(e->answer.connectedpres); - connected.source = pri_to_ast_connected_line_update_source(e->answer.source); - ast_queue_connected_line_update(owner, &connected); + if (owner) { + /* Update the connected line information on the other channel */ + ast_party_connected_line_init(&connected); + connected.id.name = e->answer.connectedname; + connected.id.number = e->answer.connectednum; + connected.id.number_type = e->answer.connectedplan; + connected.id.number_presentation = pri_to_ast_presentation(e->answer.connectedpres); + connected.source = pri_to_ast_connected_line_update_source(e->answer.source); + ast_queue_connected_line_update(owner, &connected); + } ast_mutex_unlock(&pri->pvts[chanpos]->lock); }