diff --git a/mem/q_malloc.c b/mem/q_malloc.c index 0e8ddd85a7f..b655c95f34c 100644 --- a/mem/q_malloc.c +++ b/mem/q_malloc.c @@ -121,9 +121,17 @@ inline static unsigned long big_hash_idx(unsigned long s) #ifdef DBG_QM_MALLOC + +#ifdef __CPU_x86_64 +#define ST_CHECK_PATTERN 0xf0f0f0f0f0f0f0f0 +#define END_CHECK_PATTERN1 0xc0c0c0c0c0c0c0c0 +#define END_CHECK_PATTERN2 0xabcdefedabcdefed +#else +#warning "assuming sizeof(long) = 4" #define ST_CHECK_PATTERN 0xf0f0f0f0 #define END_CHECK_PATTERN1 0xc0c0c0c0 #define END_CHECK_PATTERN2 0xabcdefed +#endif static void qm_debug_frag(struct qm_block* qm, struct qm_frag* f) @@ -711,6 +719,21 @@ void qm_info(struct qm_block* qm, struct mem_info* info) info->total_frags=total_frags; } +int qm_mem_check(struct qm_block *qm) +{ + struct qm_frag *f; + int i = 0; + + for (f = qm->first_frag; (char *)f < (char *)qm->last_frag_end; + f = FRAG_NEXT(f), i++) { + + qm_debug_frag(qm, f); + } + + LM_DBG("fragments: %d\n", i); + + return i; +} #endif diff --git a/mem/q_malloc.h b/mem/q_malloc.h index ac0371f2169..b8633c7f9d0 100644 --- a/mem/q_malloc.h +++ b/mem/q_malloc.h @@ -144,6 +144,12 @@ void* qm_realloc(struct qm_block*, void* p, unsigned long size); void qm_status(struct qm_block*); void qm_info(struct qm_block*, struct mem_info*); +/* + * On success, returns the currrent number of fragments + * Internally aborts on failure + */ +int qm_mem_check(struct qm_block *qm); + #ifdef STATISTICS static inline unsigned long qm_get_size(struct qm_block* qm) diff --git a/mem/shm_mem.c b/mem/shm_mem.c index d05ef7d951d..dc57a149f55 100644 --- a/mem/shm_mem.c +++ b/mem/shm_mem.c @@ -386,6 +386,31 @@ int shm_mem_init(void) return shm_mem_init_mallocs(shm_mempool, shm_mem_size); } +struct mi_root *mi_shm_check(struct mi_root *cmd, void *param) +{ +#ifdef DBG_QM_MALLOC + struct mi_root *root; + int ret; + + shm_lock(); + ret = qm_mem_check(shm_block); + shm_unlock(); + + /* any return means success; print the number of fragments now */ + root = init_mi_tree(200, MI_SSTR(MI_OK)); + + if (!addf_mi_node_child(&root->node, 0, MI_SSTR("total_fragments"), "%d", ret)) { + LM_ERR("failed to add MI node\n"); + free_mi_tree(root); + return NULL; + } + + return root; +#endif + + return NULL; +} + void init_shm_statistics(void) { #if defined(SHM_MEM) && defined(HP_MALLOC) diff --git a/mem/shm_mem.h b/mem/shm_mem.h index 45b84496151..41162693bcf 100644 --- a/mem/shm_mem.h +++ b/mem/shm_mem.h @@ -429,6 +429,10 @@ do{\ shm_unlock(); \ }while(0) +/* + * performs a full shared memory pool scan for any corruptions or inconsistencies + */ +struct mi_root *mi_shm_check(struct mi_root *cmd, void *param); #ifdef STATISTICS extern stat_export_t shm_stats[]; diff --git a/mi/mi_core.c b/mi/mi_core.c index 4c7e07ef334..49597a983a0 100644 --- a/mi/mi_core.c +++ b/mi/mi_core.c @@ -547,6 +547,11 @@ static mi_export_t mi_core_cmds[] = { mi_kill, MI_NO_INPUT_FLAG, 0, 0 }, { "debug", "gets/sets the value of the debug core variable", mi_debug, 0, 0, 0 }, +#ifdef DBG_QM_MALLOC + { "shm_check", "complete scan of the shared memory pool " + "(if any error is found, OpenSIPS will abort!)", + mi_shm_check, MI_NO_INPUT_FLAG, 0, 0 }, +#endif { "cache_store", "stores in a cache system a string value", mi_cachestore, 0, 0, 0 }, { "cache_fetch", "queries for a cache stored value", diff --git a/modules/rtpproxy/rtpproxy.c b/modules/rtpproxy/rtpproxy.c index 323f760125b..3d0b93469f6 100644 --- a/modules/rtpproxy/rtpproxy.c +++ b/modules/rtpproxy/rtpproxy.c @@ -3229,6 +3229,8 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, char *setid, char * struct force_rtpp_args args; struct force_rtpp_args *ap; union sockaddr_union to; + struct socket_info *si; + struct dlg_cell * dlg; struct ip_addr ip; memset(&args, '\0', sizeof(args)); @@ -3319,14 +3321,20 @@ force_rtp_proxy(struct sip_msg* msg, char* str1, char* str2, char *setid, char * lock_stop_read(nh_lock); continue; } else { - if (parse_headers(msg, HDR_VIA2_F, 0) != -1 && - (msg->via2 != NULL) && (msg->via2->error == PARSE_OK) && - update_sock_struct_from_via(&to, msg, msg->via2) != -1) { - su2ip_addr(&ip, &to); - args.raddr.s = ip_addr2a(&ip); - args.raddr.len = strlen(args.raddr.s); + if ((dlg=dlg_api.get_dlg != 0) && (dlg->flags & DLG_FLAG_TOPHIDING)) { + si = dlg->legs[DLG_CALLER_LEG].bind_addr; + args.raddr.s = si->name.s; + args.raddr.len = si->name.len; } else { - LM_ERR("can't extract 2nd via found reply\n"); + if (parse_headers(msg, HDR_VIA2_F, 0) != -1 && + (msg->via2 != NULL) && (msg->via2->error == PARSE_OK) && + update_sock_struct_from_via(&to, msg, msg->via2) != -1) { + su2ip_addr(&ip, &to); + args.raddr.s = ip_addr2a(&ip); + args.raddr.len = strlen(args.raddr.s); + } else { + LM_ERR("can't extract 2nd via from reply\n"); + } } } } diff --git a/modules/uac_registrant/registrant.c b/modules/uac_registrant/registrant.c index 0218eb0bd34..5c6551ef2bf 100644 --- a/modules/uac_registrant/registrant.c +++ b/modules/uac_registrant/registrant.c @@ -186,17 +186,18 @@ static int mod_init(void) } if(default_expires<15){ - LM_ERR("default_expires to short: [%d]<15\n", default_expires); - return -1; - } - if(timer_interval<10){ - LM_ERR("timer_interval to short: [%d]<10\n", timer_interval); + LM_ERR("default_expires too short: [%d]<15\n", default_expires); return -1; } if(reg_hsize<1 || reg_hsize>20) { LM_ERR("Wrong hash size: 20<[%d]<1\n", reg_hsize); } reg_hsize = 1<