diff --git a/src/modules/secfilter/secfilter.c b/src/modules/secfilter/secfilter.c index 94d592e434d..2b5b91d84e8 100644 --- a/src/modules/secfilter/secfilter.c +++ b/src/modules/secfilter/secfilter.c @@ -513,8 +513,6 @@ static int w_check_ip(struct sip_msg *msg) if(msg == NULL) return -1; - if(&msg->rcv.src_ip == NULL) - return -1; ip.s = ip_addr2a(&msg->rcv.src_ip); ip.len = strlen(ip.s); diff --git a/src/modules/secfilter/secfilter_db.c b/src/modules/secfilter/secfilter_db.c index 31bb0cc0fa2..274a45757be 100644 --- a/src/modules/secfilter/secfilter_db.c +++ b/src/modules/secfilter/secfilter_db.c @@ -40,7 +40,7 @@ static str table_version_col = str_init("table_version"); /* Check module version */ int check_version(void) { - int version = 0; + int version = 0, res = 0; db_key_t db_keys[1]; db_val_t db_vals[1]; db_key_t db_cols[1]; @@ -71,17 +71,15 @@ int check_version(void) db_handle, db_keys, NULL, db_vals, db_cols, 1, 1, NULL, &db_res) < 0) { LM_ERR("Failed to query database\n"); - db_funcs.close(db_handle); - return -1; + res = -1; + goto done; } if(RES_ROW_N(db_res) == 0) { LM_ERR("No version value found in database. It must be %d\n", mod_version); - if(db_res != NULL && db_funcs.free_result(db_handle, db_res) < 0) - LM_DBG("Failed to free the result\n"); - db_funcs.close(db_handle); - return -1; + res = -1; + goto done; } /* Get the version value */ @@ -90,17 +88,16 @@ int check_version(void) if(version != mod_version) { LM_ERR("Wrong version value. Correct version is %d but found %d\n", mod_version, version); - if(db_res != NULL && db_funcs.free_result(db_handle, db_res) < 0) - LM_DBG("Failed to free the result\n"); - db_funcs.close(db_handle); - return -1; + res = -1; + goto done; } +done: if(db_res != NULL && db_funcs.free_result(db_handle, db_res) < 0) LM_DBG("Failed to free the result\n"); db_funcs.close(db_handle); - return 0; + return res; } @@ -214,6 +211,7 @@ int append_rule(int action, int type, str *value) new = shm_append_str_list(v, value->len, last_node, &total); if(!new) { LM_ERR("can't append new node\n"); + shm_free(v); return -1; } LM_DBG("new node[%p] str:'%.*s'[%d]\n", new, new->s.len, new->s.s, diff --git a/src/modules/secfilter/secfilter_hdr.c b/src/modules/secfilter/secfilter_hdr.c index 4880b6a534a..7e3a4feeb42 100644 --- a/src/modules/secfilter/secfilter_hdr.c +++ b/src/modules/secfilter/secfilter_hdr.c @@ -141,40 +141,32 @@ int secf_get_to(struct sip_msg *msg, str *name, str *user, str *domain) /* get 'contact' header */ int secf_get_contact(struct sip_msg *msg, str *user, str *domain) { - str contact = {NULL, 0}; - struct sip_uri parsed_uri; + struct sip_uri uri; + contact_t *contact; - if(msg == NULL) - return -1; - if(msg->contact == NULL) + if((parse_headers(msg, HDR_CONTACT_F, 0) == -1) || !msg->contact) + return 1; + + if(!msg->contact->parsed && parse_contact(msg->contact) < 0) { + LM_ERR("cannot parse the Contact header\n"); return 1; - if(!msg->contact->parsed && (parse_contact(msg->contact) < 0)) { - LM_ERR("Error parsing contact header (%.*s)\n", msg->contact->body.len, - msg->contact->body.s); - return -1; - } - if(((contact_body_t *)msg->contact->parsed)->contacts - && ((contact_body_t *)msg->contact->parsed)->contacts->uri.s != NULL - && ((contact_body_t *)msg->contact->parsed)->contacts->uri.len - > 0) { - contact.s = ((contact_body_t *)msg->contact->parsed)->contacts->uri.s; - contact.len = - ((contact_body_t *)msg->contact->parsed)->contacts->uri.len; } - if(contact.s == NULL) + + contact = ((contact_body_t *)msg->contact->parsed)->contacts; + if(!contact) { return 1; + } - if(parse_uri(contact.s, contact.len, &parsed_uri) < 0) { - LM_ERR("Error parsing contact uri header (%.*s)\n", contact.len, - contact.s); - return -1; + if(parse_uri(contact->uri.s, contact->uri.len, &uri) < 0) { + LM_ERR("cannot parse the Contact URI\n"); + return 1; } - user->s = parsed_uri.user.s; - user->len = parsed_uri.user.len; + user->s = uri.user.s; + user->len = uri.user.len; - domain->s = parsed_uri.host.s; - domain->len = parsed_uri.host.len; + domain->s = uri.host.s; + domain->len = uri.host.len; return 0; } diff --git a/src/modules/secfilter/secfilter_rpc.c b/src/modules/secfilter/secfilter_rpc.c index 2e5a33288a4..e437524336d 100644 --- a/src/modules/secfilter/secfilter_rpc.c +++ b/src/modules/secfilter/secfilter_rpc.c @@ -65,81 +65,81 @@ void rpc_add_dst(rpc_t *rpc, void *ctx) "Invalid Parameters. Usage: secfilter.add_dst " "number\n Example: secfilter.add_dst " "555123123"); + return; + } + text = int2str(number, &data.len); + data.s = pkg_malloc(data.len * sizeof(char)); + if(!data.s) { + PKG_MEM_ERROR; + rpc->rpl_printf(ctx, "Error insert values in the blacklist"); + return; + } + memcpy(data.s, text, data.len); + lock_get(&secf_data->lock); + if(append_rule(2, 0, &data) == 0) { + rpc->rpl_printf(ctx, + "Values (%s) inserted into blacklist destinations", data); } else { - text = int2str(number, &data.len); - data.s = pkg_malloc(data.len * sizeof(char)); - if(!data.s) { - PKG_MEM_ERROR; - rpc->rpl_printf(ctx, "Error insert values in the blacklist"); - return; - } - memcpy(data.s, text, data.len); - lock_get(&secf_data->lock); - if(append_rule(2, 0, &data) == 0) { - rpc->rpl_printf(ctx, - "Values (%s) inserted into blacklist destinations", data); - } else { - rpc->rpl_printf(ctx, "Error insert values in the blacklist"); - } - lock_release(&secf_data->lock); - if(data.s) - pkg_free(data.s); + rpc->rpl_printf(ctx, "Error insert values in the blacklist"); } + lock_release(&secf_data->lock); + if(data.s) + pkg_free(data.s); } /* Add blacklist value */ void rpc_add_bl(rpc_t *rpc, void *ctx) { - char *ctype; + char *ctype = NULL; str data = STR_NULL; int type; - if(rpc->scan(ctx, "ss", (char *)(&ctype), (char *)(&data.s)) < 2) { + if(rpc->scan(ctx, "ss", ctype, &data.s) < 2) { rpc->fault(ctx, 0, "Invalid Parameters. Usage: secfilter.add_bl type " "value\n Example: secfilter.add_bl user " "sipvicious"); + return; + } + data.len = strlen(data.s); + type = get_type(ctype); + + lock_get(&secf_data->lock); + if(append_rule(0, type, &data) == 0) { + rpc->rpl_printf(ctx, "Values (%s, %s) inserted into blacklist", + ctype, data); } else { - data.len = strlen(data.s); - type = get_type(ctype); - - lock_get(&secf_data->lock); - if(append_rule(0, type, &data) == 0) { - rpc->rpl_printf(ctx, "Values (%s, %s) inserted into blacklist", - ctype, data); - } else { - rpc->rpl_printf(ctx, "Error insert values in the blacklist"); - } - lock_release(&secf_data->lock); + rpc->rpl_printf(ctx, "Error insert values in the blacklist"); } + lock_release(&secf_data->lock); } /* Add whitelist value */ void rpc_add_wl(rpc_t *rpc, void *ctx) { - char *ctype; + char *ctype = NULL; str data = STR_NULL; int type; - if(rpc->scan(ctx, "ss", (char *)(&ctype), (char *)(&data.s)) < 2) { + if(rpc->scan(ctx, "ss", ctype, &data.s) < 2) { rpc->fault(ctx, 0, "Invalid Parameters. Usage: secfilter.add_wl type " "value\n Example: secfilter.add_wl user " "trusted_user"); + return; + } + data.len = strlen(data.s); + type = get_type(ctype); + + lock_get(&secf_data->lock); + if(append_rule(1, type, &data) == 0) { + rpc->rpl_printf( + ctx, "Values (%s, %s) inserted into whitelist", type, data); } else { - data.len = strlen(data.s); - type = get_type(ctype); - - lock_get(&secf_data->lock); - if(append_rule(1, type, &data) == 0) { - rpc->rpl_printf( - ctx, "Values (%s, %s) inserted into whitelist", type, data); - } else { - rpc->rpl_printf(ctx, "Error insert values in the whitelist"); - } - lock_release(&secf_data->lock); + rpc->rpl_printf(ctx, "Error insert values in the whitelist"); } + lock_release(&secf_data->lock); }