stomp on seg fault if a call is attempted and the skinny device is not registered
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1515 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
439073659d
commit
998e717611
|
@ -1438,6 +1438,15 @@ static int skinny_call(struct ast_channel *ast, char *dest, int timeout)
|
||||||
struct skinny_subchannel *sub;
|
struct skinny_subchannel *sub;
|
||||||
struct skinnysession *session;
|
struct skinnysession *session;
|
||||||
|
|
||||||
|
sub = ast->pvt->pvt;
|
||||||
|
l = sub->parent;
|
||||||
|
session = l->parent->session;
|
||||||
|
|
||||||
|
if (!l->parent->registered) {
|
||||||
|
ast_log(LOG_ERROR, "Device not registered, cannot call %s\n", dest);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
|
if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) {
|
||||||
ast_log(LOG_WARNING, "skinny_call called on %s, neither down nor reserved\n", ast->name);
|
ast_log(LOG_WARNING, "skinny_call called on %s, neither down nor reserved\n", ast->name);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1446,14 +1455,10 @@ static int skinny_call(struct ast_channel *ast, char *dest, int timeout)
|
||||||
if (skinnydebug) {
|
if (skinnydebug) {
|
||||||
ast_verbose(VERBOSE_PREFIX_3 "skinny_call(%s)\n", ast->name);
|
ast_verbose(VERBOSE_PREFIX_3 "skinny_call(%s)\n", ast->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub = ast->pvt->pvt;
|
|
||||||
l = sub->parent;
|
|
||||||
session = l->parent->session;
|
|
||||||
|
|
||||||
if (l->dnd) {
|
if (l->dnd) {
|
||||||
ast_queue_control(ast, AST_CONTROL_BUSY, 0);
|
ast_queue_control(ast, AST_CONTROL_BUSY, 0);
|
||||||
return 0;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (l->hookstate) {
|
switch (l->hookstate) {
|
||||||
|
@ -1525,18 +1530,19 @@ static int skinny_hangup(struct ast_channel *ast)
|
||||||
ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
|
ast_log(LOG_DEBUG, "Asked to hangup channel not connected\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ((sub->parent->type = TYPE_LINE) && (sub->parent->hookstate == SKINNY_OFFHOOK)) {
|
|
||||||
sub->parent->hookstate = SKINNY_ONHOOK;
|
|
||||||
transmit_callstate(s, l->instance, SKINNY_ONHOOK, sub->callid);
|
|
||||||
transmit_speaker_mode(s, SKINNY_SPEAKEROFF);
|
|
||||||
} else if ((sub->parent->type = TYPE_LINE) && (sub->parent->hookstate == SKINNY_ONHOOK)) {
|
|
||||||
transmit_callstate(s, l->instance, SKINNY_ONHOOK, sub->callid);
|
|
||||||
transmit_speaker_mode(s, SKINNY_SPEAKEROFF);
|
|
||||||
transmit_ringer_mode(s, SKINNY_RING_OFF);
|
|
||||||
transmit_tone(s, SKINNY_SILENCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
if (l->parent->registered) {
|
||||||
|
if ((sub->parent->type = TYPE_LINE) && (sub->parent->hookstate == SKINNY_OFFHOOK)) {
|
||||||
|
sub->parent->hookstate = SKINNY_ONHOOK;
|
||||||
|
transmit_callstate(s, l->instance, SKINNY_ONHOOK, sub->callid);
|
||||||
|
transmit_speaker_mode(s, SKINNY_SPEAKEROFF);
|
||||||
|
} else if ((sub->parent->type = TYPE_LINE) && (sub->parent->hookstate == SKINNY_ONHOOK)) {
|
||||||
|
transmit_callstate(s, l->instance, SKINNY_ONHOOK, sub->callid);
|
||||||
|
transmit_speaker_mode(s, SKINNY_SPEAKEROFF);
|
||||||
|
transmit_ringer_mode(s, SKINNY_RING_OFF);
|
||||||
|
transmit_tone(s, SKINNY_SILENCE);
|
||||||
|
}
|
||||||
|
}
|
||||||
ast_mutex_lock(&sub->lock);
|
ast_mutex_lock(&sub->lock);
|
||||||
sub->owner = NULL;
|
sub->owner = NULL;
|
||||||
ast->pvt->pvt = NULL;
|
ast->pvt->pvt = NULL;
|
||||||
|
|
Reference in New Issue