diff -Naur visdn-0.18.2/chan_visdn/chan_visdn.c visdn-0.18.2.oden/chan_visdn/chan_visdn.c --- visdn-0.18.2/chan_visdn/chan_visdn.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/chan_visdn/chan_visdn.c 2006-12-13 11:48:30.000000000 +0100 @@ -95,6 +95,9 @@ #include "disconnect.h" #include "numbers_list.h" +/* was hardcoded to 100, but that's definitely not enough! */ +#define MAX_SYS_PATH 256 + static pthread_t visdn_q931_thread = AST_PTHREADT_NULL; struct visdn_state visdn = { @@ -398,7 +401,10 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) - return FALSE; + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return 0; + } ast_queue_control(ast_chan, AST_CONTROL_ANSWER); @@ -1204,7 +1210,7 @@ struct visdn_chan *visdn_chan1 = to_visdn_chan(c0); struct visdn_chan *visdn_chan2 = to_visdn_chan(c1); - char pipeline[100], dest1[100], dest2[100]; + char pipeline[MAX_SYS_PATH], dest1[MAX_SYS_PATH], dest2[MAX_SYS_PATH]; snprintf(pipeline, sizeof(pipeline), "/sys/class/net/%s/visdn_channel/connected/../B%d", @@ -1904,35 +1910,37 @@ return 0; } + +static struct ast_frame f_null = { + .src = VISDN_CHAN_TYPE, + .mallocd = 0, + .delivery.tv_sec = 0, + .delivery.tv_usec = 0, + .frametype = AST_FRAME_NULL, + .subclass = 0, + .samples = 0, + .datalen = 0, + .data = NULL, + .offset = 0, +}; + + static struct ast_frame *visdn_read(struct ast_channel *ast_chan) { struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); - static struct ast_frame f; + struct ast_frame f; /* Acknowledge timer */ read(ast_chan->fds[0], visdn_chan->buf, 1); - f.src = VISDN_CHAN_TYPE; - f.mallocd = 0; - f.delivery.tv_sec = 0; - f.delivery.tv_usec = 0; - - if (visdn_chan->sp_fd < 0) { - f.frametype = AST_FRAME_NULL; - f.subclass = 0; - f.samples = 0; - f.datalen = 0; - f.data = NULL; - f.offset = 0; - - return &f; - } + if (visdn_chan->sp_fd < 0) + return &f_null; int nread = read(visdn_chan->sp_fd, visdn_chan->buf, sizeof(visdn_chan->buf)); if (nread < 0) { ast_log(LOG_WARNING, "read error: %s\n", strerror(errno)); - return &f; + return &f_null; } #if 0 @@ -1959,8 +1967,20 @@ f.datalen = nread; f.data = visdn_chan->buf; f.offset = 0; + f.mallocd = 0; + f.delivery.tv_sec = 0; + f.delivery.tv_usec = 0; struct ast_frame *f2 = ast_dsp_process(ast_chan, visdn_chan->dsp, &f); + if(&f == f2) { + f2 = malloc(sizeof(f)); + if(!f2) { + ast_log(LOG_ERROR, "Out of memory\n"); + return NULL; + } + *f2 = f; + f2->mallocd = AST_MALLOCD_HDR; + } return f2; } @@ -2531,9 +2551,19 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_mutex_lock(&ast_chan->lock); + + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + visdn_handle_eventual_progind(ast_chan, ies); ast_mutex_unlock(&ast_chan->lock); @@ -2552,7 +2582,10 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_queue_control(ast_chan, AST_CONTROL_ANSWER); @@ -2604,15 +2637,37 @@ FUNC_DEBUG(); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_mutex_lock(&ast_chan->lock); + + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + visdn_handle_eventual_progind(ast_chan, ies); visdn_set_hangupcause_by_ies(ast_chan, ies); ast_mutex_unlock(&ast_chan->lock); struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + + if (!visdn_chan) + { + ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n"); + return; + } + if (visdn_chan->inband_info && visdn_chan->channel_has_been_connected) { ast_queue_control(ast_chan, AST_CONTROL_INBAND_INFO); @@ -2639,10 +2694,19 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + if (!visdn_chan) + { + ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n"); + return; + } + if (q931_call->state != U2_OVERLAP_SENDING && q931_call->state != N2_OVERLAP_SENDING && q931_call->state != U25_OVERLAP_RECEIVING && @@ -2686,10 +2750,19 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + if (!visdn_chan) + { + ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n"); + return; + } + if (visdn_chan->sent_digits < strlen(visdn_chan->number)) { /* There are still digits to be sent in INFO */ @@ -2734,12 +2807,28 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_mutex_lock(&ast_chan->lock); + + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + visdn_handle_eventual_progind(ast_chan, ies); ast_mutex_unlock(&ast_chan->lock); + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); visdn_undefer_dtmf_in(visdn_chan); @@ -2756,12 +2845,28 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_mutex_lock(&ast_chan->lock); + + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + visdn_handle_eventual_progind(ast_chan, ies); ast_mutex_unlock(&ast_chan->lock); + if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + ast_queue_control(ast_chan, AST_CONTROL_PROGRESS); } @@ -2770,6 +2875,13 @@ const struct q931_ies *ies) { struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + + if (!visdn_chan) + { + ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n"); + return; + } + struct q931_ie_cause *cause = NULL; int i; @@ -2827,7 +2939,10 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } visdn_hunt_next_or_hangup(ast_chan, ies); } @@ -2842,7 +2957,10 @@ struct ast_channel *ast_chan = callpvt_to_astchan(q931_call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_mutex_lock(&ast_chan->lock); visdn_set_hangupcause_by_ies(ast_chan, ies); @@ -3026,7 +3144,10 @@ Q931_CCB_SETUP_COMPLETE_REQUEST, NULL); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_queue_control(ast_chan, AST_CONTROL_ANSWER); @@ -4011,19 +4132,36 @@ FUNC_DEBUG(); assert(channel->call); + if(!channel->call) { + ast_log(LOG_WARNING, "Unexpexted call NULL\n"); + return; + } struct ast_channel *ast_chan = callpvt_to_astchan(channel->call); - if (!ast_chan) + if (!ast_chan) { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_mutex_lock(&ast_chan->lock); + if (!ast_chan) { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); + return; + } + struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + + if (!visdn_chan) { + ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n"); + return; + } + struct visdn_ic *ic = visdn_chan->ic; visdn_chan->channel_has_been_connected = TRUE; - char pipeline[100], dest[100]; + char pipeline[MAX_SYS_PATH], dest[MAX_SYS_PATH]; snprintf(pipeline, sizeof(pipeline), "%s/%s%d", ic->intf->remote_port, @@ -4094,10 +4232,19 @@ struct ast_channel *ast_chan = callpvt_to_astchan(channel->call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + if (!visdn_chan) + { + ast_log(LOG_WARNING, "Unexpexted visdn_chan NULL\n"); + return; + } + ast_mutex_lock(&ast_chan->lock); visdn_disconnect_chan_from_visdn(visdn_chan); @@ -4115,7 +4262,10 @@ // Unfortunately, after ast_hangup the channel is not valid // anymore and we cannot generate further tones thought we should if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } switch (tone) { case Q931_TONE_DIAL: @@ -4147,7 +4297,10 @@ struct ast_channel *ast_chan = callpvt_to_astchan(channel->call); if (!ast_chan) + { + ast_log(LOG_WARNING, "Unexpexted ast_chan NULL\n"); return; + } ast_indicate(ast_chan, -1); } @@ -4562,7 +4715,6 @@ (call->direction == Q931_CALL_DIRECTION_INBOUND) ? 'I' : 'O'); - ast_cli(fd, "%-17s %-25s", idstr, q931_call_state_to_text(call->state)); @@ -4571,9 +4723,10 @@ if (ast_chan) { struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); - ast_cli(fd, "%s%s", - visdn_chan->number, - visdn_chan->sending_complete ? "(SC)" : ""); + if(visdn_chan && visdn_chan->number) + ast_cli(fd, "%s%s", + visdn_chan->number, + visdn_chan->sending_complete ? "(SC)" : ""); } ast_cli(fd, "\n"); @@ -4690,6 +4843,10 @@ struct ast_channel *ast_chan = callpvt_to_astchan(call); if (ast_chan) { struct visdn_chan *visdn_chan = to_visdn_chan(ast_chan); + if(!visdn_chan) { + ast_cli(fd, "... visdn channel has been freed ...\n"); + return; + } ast_cli(fd, "------ Asterisk Channel\n"); diff -Naur visdn-0.18.2/chan_visdn/overlap.c visdn-0.18.2.oden/chan_visdn/overlap.c --- visdn-0.18.2/chan_visdn/overlap.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/chan_visdn/overlap.c 2006-12-13 11:48:30.000000000 +0100 @@ -256,10 +256,11 @@ break; if (f->frametype == AST_FRAME_DTMF) - do_exit = new_digit(chan, called_number, - sizeof(called_number), - f->subclass, &retval); - + { + do_exit = new_digit(chan, called_number, + sizeof(called_number), + f->subclass, &retval); + } ast_frfree(f); } diff -Naur visdn-0.18.2/libq931/call.c visdn-0.18.2.oden/libq931/call.c --- visdn-0.18.2/libq931/call.c 2006-10-30 11:56:04.000000000 +0100 +++ visdn-0.18.2.oden/libq931/call.c 2006-12-13 11:48:30.000000000 +0100 @@ -359,6 +359,11 @@ q931_dlc_release(call->dlc); q931_dlc_put(call->dlc); } + q931_ies_flush(&call->setup_ies); + + q931_ies_flush(&call->disconnect_cause); + q931_ies_flush(&call->saved_cause); + q931_ies_flush(&call->release_cause); q931_intf_del_call(call); @@ -5635,7 +5640,7 @@ cs = container_of(msg->ies.ies[i], struct q931_ie_call_state, ie); } else if (msg->ies.ies[i]->cls->id == Q931_IE_CAUSE) { - q931_ies_add_put(&ies, msg->ies.ies[i]); + q931_ies_add(&ies, msg->ies.ies[i]); } } diff -Naur visdn-0.18.2/libq931/channel.c visdn-0.18.2.oden/libq931/channel.c --- visdn-0.18.2/libq931/channel.c 2006-10-30 11:56:04.000000000 +0100 +++ visdn-0.18.2.oden/libq931/channel.c 2006-12-13 11:48:30.000000000 +0100 @@ -90,6 +90,9 @@ struct q931_channel *channel, enum q931_channel_state state) { + if (!channel) + return; + report_chan(channel, LOG_DEBUG, "changed state from %s to %s\n", q931_channel_state_to_text(channel->state), @@ -101,6 +104,9 @@ void q931_channel_connect( struct q931_channel *channel) { + if (!channel) + return; + assert(channel); assert(channel->call); @@ -114,6 +120,9 @@ void q931_channel_control( struct q931_channel *channel) { + if (!channel) + return; + assert(channel); assert(channel->call); @@ -166,6 +175,8 @@ struct q931_channel *channel, enum q931_tone_type tone) { + if (!channel) + return; assert(channel); q931_channel_primitive1(channel, Q931_CCB_START_TONE, tone); @@ -174,6 +185,8 @@ void q931_channel_stop_tone( struct q931_channel *channel) { + if (!channel) + return; assert(channel); q931_channel_primitive(channel, Q931_CCB_STOP_TONE); @@ -184,6 +197,9 @@ int id, struct q931_interface *intf) { + if (!channel) + return; + channel->id = id; channel->intf = intf; channel->state = Q931_CHANSTATE_AVAILABLE; diff -Naur visdn-0.18.2/libq931/message.c visdn-0.18.2.oden/libq931/message.c --- visdn-0.18.2/libq931/message.c 2006-10-30 11:56:04.000000000 +0100 +++ visdn-0.18.2.oden/libq931/message.c 2006-12-13 11:48:30.000000000 +0100 @@ -40,8 +40,11 @@ if (msg->refcnt == 0) { report_msg(msg, LOG_DEBUG, "Releasing message\n"); - if (msg->dlc) + if (msg->dlc) { q931_dlc_put(msg->dlc); + msg->dlc=NULL; + } + q931_ies_flush(&msg->ies); free(msg); } diff -Naur visdn-0.18.2/modules/core/core_main.c visdn-0.18.2.oden/modules/core/core_main.c --- visdn-0.18.2/modules/core/core_main.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/modules/core/core_main.c 2006-12-13 11:48:30.000000000 +0100 @@ -17,6 +17,7 @@ #include <linux/cdev.h> #include <linux/kdev_t.h> #include <linux/device.h> +#include <linux/notifier.h> #include <kernel_config.h> @@ -74,22 +75,26 @@ EXPORT_SYMBOL(visdn_system_device); static struct notifier_block *visdn_notify_chain; +static struct raw_notifier_head visdn_notify_chain_head; int visdn_register_notifier(struct notifier_block *nb) { - return notifier_chain_register(&visdn_notify_chain, nb); + visdn_notify_chain_head.head = visdn_notify_chain; + return raw_notifier_chain_register(&visdn_notify_chain_head, nb); } EXPORT_SYMBOL(visdn_register_notifier); int visdn_unregister_notifier(struct notifier_block *nb) { - return notifier_chain_unregister(&visdn_notify_chain, nb); + visdn_notify_chain_head.head = visdn_notify_chain; + return raw_notifier_chain_unregister(&visdn_notify_chain_head, nb); } EXPORT_SYMBOL(visdn_unregister_notifier); int visdn_call_notifiers(unsigned long val, void *v) { - return notifier_call_chain(&visdn_notify_chain, val, v); + visdn_notify_chain_head.head = visdn_notify_chain; + return raw_notifier_call_chain(&visdn_notify_chain_head, val, v); } EXPORT_SYMBOL(visdn_call_notifiers); diff -Naur visdn-0.18.2/modules/ec/ec_main.c visdn-0.18.2.oden/modules/ec/ec_main.c --- visdn-0.18.2/modules/ec/ec_main.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/modules/ec/ec_main.c 2006-12-13 11:48:30.000000000 +0100 @@ -509,7 +509,7 @@ NULL); //---------------------------------------------------------------------------- - +/* static struct vec_ec *_vec_ec_search_by_id(int id) { struct vec_ec *ec; @@ -521,7 +521,7 @@ return NULL; } - +*/ static int _vec_ec_alloc_id(void) { struct vec_ec *ec; diff -Naur visdn-0.18.2/modules/hfc-4s/sys_chan.c visdn-0.18.2.oden/modules/hfc-4s/sys_chan.c --- visdn-0.18.2/modules/hfc-4s/sys_chan.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/modules/hfc-4s/sys_chan.c 2006-12-13 11:48:30.000000000 +0100 @@ -699,7 +699,7 @@ if (used_octets > HFC_FIFO_JITTBUFF_HIGH) { // printk(KERN_DEBUG "Trimming output fifo\n"); - goto not_copying; +// goto not_copying; } if (used_octets < chan->tx_fifo.stats_min) @@ -710,7 +710,7 @@ hfc_fifo_mem_write(&chan->tx_fifo, buf, copied_octets); -not_copying: +//not_copying: hfc_card_unlock(card); return copied_octets; diff -Naur visdn-0.18.2/modules/hfc-pci/st_chan.c visdn-0.18.2.oden/modules/hfc-pci/st_chan.c --- visdn-0.18.2/modules/hfc-pci/st_chan.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/modules/hfc-pci/st_chan.c 2006-12-13 11:48:30.000000000 +0100 @@ -967,7 +967,7 @@ if (used_octets > HFC_FIFO_JITTBUFF * 2) { // printk(KERN_DEBUG "Trimming output fifo\n"); - goto not_copying; +// goto not_copying; } if (used_octets < chan->tx_fifo->stats_min) @@ -982,7 +982,7 @@ Z1_F1(chan->tx_fifo), count)); -not_copying: +//not_copying: hfc_card_unlock(card); return copied_octets; diff -Naur visdn-0.18.2/modules/vgsm/card.c visdn-0.18.2.oden/modules/vgsm/card.c --- visdn-0.18.2/modules/vgsm/card.c 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/modules/vgsm/card.c 2006-12-13 11:49:46.000000000 +0100 @@ -164,7 +164,7 @@ vgsm_send_msg(&card->micros[0], &msg); vgsm_card_unlock(card); } - +/* static void vgsm_send_codec_getreg( struct vgsm_card *card, u8 reg_address) @@ -179,7 +179,7 @@ vgsm_send_msg(&card->micros[0], &msg); } - +*/ void vgsm_send_get_fw_ver(struct vgsm_micro *micro) { struct vgsm_micro_message msg = { }; @@ -474,7 +474,7 @@ if (test_bit(VGSM_MODULE_STATUS_RUNNING, &module->status)) { for(i=0; i<msg->numbytes; i++) { - if (module->tty->flip.count >= TTY_FLIPBUF_SIZE) + if (module->tty->max_flip_cnt >= TTY_FLIPBUF_SIZE) tty_flip_buffer_push(module->tty); tty_insert_flip_char(module->tty, msg->payload[i], diff -Naur visdn-0.18.2/samples/extensions.conf.sample visdn-0.18.2.oden/samples/extensions.conf.sample --- visdn-0.18.2/samples/extensions.conf.sample 2006-10-30 11:56:05.000000000 +0100 +++ visdn-0.18.2.oden/samples/extensions.conf.sample 2006-12-13 11:48:30.000000000 +0100 @@ -20,6 +20,10 @@ exten => s,1,SetCallerID(12345000) ; Set the MSN to be used exten => s,2,Dial(VISDN/visdn1.0/${ARG1}) +[macro-telcobri_out_hunt] +exten => s,1,SetCallerID(12345000) ; Set the MSN to be used +exten => s,2,Dial(VISDN/huntgroup:telco/${ARG1}) + ;------------------------ ; Dialin PPP extension