- Various fixes due to a code review by Andrew Jones

This commit is contained in:
Thomas Ries
2006-10-13 17:40:09 +00:00
parent 1f8c9a8dbb
commit 46c602c6db
15 changed files with 88 additions and 170 deletions
+3 -2
View File
@@ -1,9 +1,10 @@
0.6.0
=====
05-Oct-2006_ - route_determine_nexthop(): don't remove header
13-Oct-2006: - Various fixes due to a code review by Andrew Jones
05-Oct-2006: - route_determine_nexthop(): don't remove header
19-Aug-2006: - increased DNS cache
18-Jun-2006: - included RTCP support and a de-jitter feature
(submitted by by Hans Carlos Hofmann)
(submitted by Hans Carlos Hofmann)
0.5.13
======
+1
View File
@@ -399,6 +399,7 @@ fi
AC_CHECK_FUNCS(getopt_long setsid syslog)
AC_CHECK_FUNCS(getuid setuid getgid setgid getpwnam chroot)
AC_CHECK_FUNCS(socket bind select read send sendto fcntl)
AC_CHECK_FUNCS(strcmp strcasecmp)
AC_CHECK_FUNCS(strncpy strchr strstr sprintf vfprintf vsnprintf)
AC_CHECK_FUNCS(listen accept)
AC_CHECK_FUNCS(fgets sscanf)
+3 -2
View File
@@ -31,6 +31,7 @@ siproxd_SOURCES = siproxd.c proxy.c register.c sock.c utils.c \
rtpproxy_relay.c accessctl.c route_processing.c \
security.c auth.c fwapi.c resolve.c \
plugin_shortdial.c
# addrcache.c
#
# an example for a custom firewall control module
@@ -40,8 +41,8 @@ noinst_LIBRARIES = libcustom_fw_module.a
libcustom_fw_module_a_SOURCES = custom_fw_module.c
noinst_HEADERS = log.h rewrite_rules.h siproxd.h digcalc.h rtpproxy.h \
fwapi.h plugins.h
noinst_HEADERS = log.h siproxd.h digcalc.h rtpproxy.h \
fwapi.h plugins.h addrcache.h
EXTRA_DIST = .buildno
+2 -1
View File
@@ -141,7 +141,7 @@ int process_aclist (char *aclist, struct sockaddr_in from) {
/* mask */
p1=strchr(p2,',');
p1=p2+1;
p1=p1+1;
p2=strchr(p1,',');
if (!p2) { /* then this must be the last entry in the list */
p2=strchr(p1,'\0');
@@ -165,6 +165,7 @@ int process_aclist (char *aclist, struct sockaddr_in from) {
}
mask_int=atoi(mask);
if ((mask_int < 0) || (mask_int > 32)) mask_int=32;
bitmask= (mask_int)? (0xffffffff<<(32-mask_int)) : 0;
DEBUGC(DBCLASS_ACCESS,"check match: entry=%i, filter=%lx, from=%lx", i,
+6 -2
View File
@@ -198,7 +198,11 @@ static int auth_check(osip_proxy_authorization_t *proxy_auth) {
password=configuration.proxy_auth_passwd;
}
if (password == NULL) password="";
if (password == NULL) {
DEBUGC(DBCLASS_AUTH,"user [%s] not in password file!",
(Username)?Username:"*NULL*");
return STS_FAILURE;
}
DEBUGC(DBCLASS_BABBLE," username=\"%s\"",Username );
DEBUGC(DBCLASS_BABBLE," realm =\"%s\"",Realm );
@@ -281,7 +285,7 @@ static char *auth_getpwd(char *username) {
/* strip comments and line with only whitespaces */
for (i=0;i<strlen(buff);i++) {
if ((buff[i] == ' ') && (buff[i] == '\t')) continue;
if ((buff[i] == ' ') || (buff[i] == '\t')) continue;
if (buff[i] =='#') i=strlen(buff);
break;
}
+1 -1
View File
@@ -69,7 +69,7 @@ int plugin_shortdial(sip_ticket_t *ticket) {
return STS_SUCCESS; /* ignore */
shortcut_no = atoi(&(req_url->username[1]));
if (shortcut_no <= 0) return STS_SUCCESS; /* not a number */
if ((shortcut_no <= 0) || (shortcut_no >= LONG_MAX)) return STS_SUCCESS; /* not a number */
/* requested number is not defined (out of range) */
if (shortcut_no > configuration.pi_shortdial_entry.used) {
+9 -7
View File
@@ -187,9 +187,8 @@ int proxy_request (sip_ticket_t *ticket) {
* (rewrite request URI to point to the real host)
*/
/* 'i' still holds the valid index into the URLMAP table */
if (check_rewrite_rq_uri(request) == STS_TRUE) {
proxy_rewrite_request_uri(request, i);
}
proxy_rewrite_request_uri(request, i);
/* if this is CANCEL/BYE request, stop RTP proxying */
if (MSG_IS_BYE(request) || MSG_IS_CANCEL(request)) {
@@ -299,7 +298,7 @@ int proxy_request (sip_ticket_t *ticket) {
{
osip_header_t *max_forwards;
int forwards_count = DEFAULT_MAXFWD;
char mfwd[8];
char mfwd[12]; /* 10 digits, +/- sign, termination */
osip_message_get_max_forwards(request, 0, &max_forwards);
if (max_forwards == NULL) {
@@ -308,6 +307,8 @@ int proxy_request (sip_ticket_t *ticket) {
} else {
if (max_forwards->hvalue) {
forwards_count = atoi(max_forwards->hvalue);
if ((forwards_count<=0)||
(forwards_count>=LONG_MAX)) forwards_count=DEFAULT_MAXFWD;
forwards_count -=1;
osip_free (max_forwards->hvalue);
}
@@ -432,6 +433,7 @@ int proxy_request (sip_ticket_t *ticket) {
if (url->port) {
port=atoi(url->port);
if ((port<=0) || (port>65535)) port=SIP_PORT;
} else {
port=SIP_PORT;
}
@@ -750,6 +752,7 @@ int proxy_response (sip_ticket_t *ticket) {
if (via->port) {
port=atoi(via->port);
if ((port<=0) || (port>65535)) port=SIP_PORT;
} else {
port=SIP_PORT;
}
@@ -1000,8 +1003,7 @@ if (configuration.debuglevel)
/* start an RTP proxying stream */
if (sdp_message_m_port_get(sdp, media_stream_no)) {
msg_port=atoi(sdp_message_m_port_get(sdp, media_stream_no));
if (msg_port > 0) {
if ((msg_port > 0) && (msg_port <= 65535)) {
/* is this an RTP stream ? */
{
@@ -1044,7 +1046,7 @@ if (configuration.debuglevel)
static char from_string[HOSTNAME_SIZE];
char *tmp;
tmp=utils_inet_ntoa(ticket->from.sin_addr);
strncpy(from_string, tmp, HOSTNAME_SIZE-1);
strncpy(from_string, tmp, HOSTNAME_SIZE);
from_string[HOSTNAME_SIZE-1]='\0';
client_id=from_string;
}
+19
View File
@@ -75,6 +75,7 @@ void register_init(void) {
for (i=0;i < URLMAP_SIZE; i++) {
fgets(buff, sizeof(buff), stream);
sts=sscanf(buff, "***:%i:%i", &urlmap[i].active, &urlmap[i].expires);
if (sts == 0) break; /* format error */
if (urlmap[i].active) {
osip_uri_init(&urlmap[i].true_url);
osip_uri_init(&urlmap[i].masq_url);
@@ -89,6 +90,7 @@ void register_init(void) {
len = strlen(buff);\
X =(char*)malloc(len+1);\
sts=sscanf(buff,"%s",X);\
if (sts == 0) break;\
} else {\
X = NULL;\
}\
@@ -109,6 +111,14 @@ void register_init(void) {
}
}
fclose(stream);
/* check for premature abort of reading the registration file */
if (i < URLMAP_SIZE) {
/* clean up and delete it */
WARN("registration file corrupt, starting with empty table");
memset(urlmap, 0, sizeof(urlmap));
unlink(configuration.registrationfile);
}
}
}
/* initialize save-timer */
@@ -282,9 +292,13 @@ int register_client(sip_ticket_t *ticket, int force_lcl_masq) {
if (expires_param && expires_param->gvalue) {
/* get expires from contact Header */
expires=atoi(expires_param->gvalue);
if ((expires < 0) || (expires >= LONG_MAX))
expires=configuration.default_expires;
} else if (expires_hdr && expires_hdr->hvalue) {
/* get expires from expires Header */
expires=atoi(expires_hdr->hvalue);
if ((expires < 0) || (expires >= LONG_MAX))
expires=configuration.default_expires;
} else {
char tmp[16];
/* it seems, the expires field is not present everywhere... */
@@ -595,6 +609,7 @@ int register_response(sip_ticket_t *ticket, int flag) {
/* send answer back */
if (via->port) {
port=atoi(via->port);
if ((port<=0) || (port>65535)) port=SIP_PORT;
} else {
port=configuration.sip_listen_port;
}
@@ -650,9 +665,13 @@ int register_set_expire(sip_ticket_t *ticket) {
if (expires_param && expires_param->gvalue) {
/* get expires from contact Header */
expires=atoi(expires_param->gvalue);
if ((expires < 0) || (expires >= LONG_MAX))
expires=configuration.default_expires;
} else if (expires_hdr && expires_hdr->hvalue) {
/* get expires from expires Header */
expires=atoi(expires_hdr->hvalue);
if ((expires < 0) || (expires >= LONG_MAX))
expires=configuration.default_expires;
}
DEBUGC(DBCLASS_REG,"Expires=%i, expires_param=%p, expires_hdr=%p",
+1 -1
View File
@@ -209,7 +209,7 @@ static int _resolve(char *name, int proto, int type,
priority = pr;
weight = we;
*port = po;
strncpy(dname, tmpname, dnamelen-1);
strncpy(dname, tmpname, dnamelen);
xptr+=j;
}
}
-68
View File
@@ -1,68 +0,0 @@
/*
Copyright (C) 2002-2005 Thomas Ries <tries@gmx.net>
This file is part of Siproxd.
Siproxd is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Siproxd is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Siproxd; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* $Id$ */
/*
* SIP Method 'knowledg base'
* This table tells siproxd what incomming requests (which methods)
* it shell rewite and which not. E.g. kphone behaves silly
* if a incoming SUBSCRIBE request is rewritten to the local host...
*/
static struct {
char *UAstring;
int action[12];
} RQ_rewrite[] =
{
/*
1 means: rewrite, 0 means don't rewrite, -1 means default
UA string I A R B O I C R N S M P
N C E Y P N A E O U E R
V K G E T F N F T B S A
I I I O C E I S S C
T S O E R F C A K
E T N L Y R G
*/
{"oSIP/Linphone",{-1, -1, -1, -1, -1, -1. -1, -1, -1, -1, -1, -1}},
{"Windows RTC", {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
{"KPhone", {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}},
/* the following line holds the default entries */
{NULL, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}
};
static struct {
char *name;
int size;
} RQ_method[] = {
{ "INVITE", 6 },
{ "ACK", 3 },
{ "REGISTER", 8 },
{ "BYE", 3 },
{ "OPTIONS", 7 },
{ "INFO", 4 },
{ "CANCEL", 6 },
{ "REFER", 5 },
{ "NOTIFY", 6 },
{ "SUBSCRIBE", 9 },
{ "MESSAGE", 7 },
{ "PRACK", 5 },
{ NULL, 0 }
};
+2
View File
@@ -83,6 +83,7 @@ int route_preprocess(sip_ticket_t *ticket){
*/
url = osip_message_get_uri(mymsg);
dest_port= (url->port)?atoi(url->port):SIP_PORT;
if ((dest_port <=0) || (dest_port >65535)) dest_port=SIP_PORT;
if (get_ip_by_host(url->host, &addr1) == STS_SUCCESS) {
if ((configuration.sip_listen_port == dest_port) &&
@@ -397,6 +398,7 @@ int route_determine_nexthop(sip_ticket_t *ticket,
if (route->url->port) {
*port=atoi(route->url->port);
if ((*port<=0) || (*port>65535)) *port=SIP_PORT;
} else {
*port=SIP_PORT;
}
+35 -82
View File
@@ -40,7 +40,6 @@
#include "siproxd.h"
#include "digcalc.h"
#include "rewrite_rules.h"
#include "log.h"
static char const ident[]="$Id$";
@@ -64,13 +63,6 @@ osip_message_t *msg_make_template_reply (sip_ticket_t *ticket, int code) {
osip_message_t *response;
int pos;
osip_message_init (&response);
response->message=NULL;
osip_message_set_version (response, osip_strdup ("SIP/2.0"));
osip_message_set_status_code (response, code);
osip_message_set_reason_phrase (response,
osip_strdup(osip_message_get_reason (code)));
if (request->to==NULL) {
ERROR("msg_make_template_reply: empty To in request header");
return NULL;
@@ -81,6 +73,18 @@ osip_message_t *msg_make_template_reply (sip_ticket_t *ticket, int code) {
return NULL;
}
osip_message_init (&response);
if (response == NULL) {
ERROR("msg_make_template_reply: osip_message_init() failed");
return NULL;
}
response->message=NULL;
osip_message_set_version (response, osip_strdup ("SIP/2.0"));
osip_message_set_status_code (response, code);
osip_message_set_reason_phrase (response,
osip_strdup(osip_message_get_reason (code)));
osip_to_clone (request->to, &response->to);
osip_from_clone (request->from, &response->from);
@@ -213,8 +217,12 @@ int is_via_local (osip_via_t *via) {
}
/* check the extracted VIA against my own host addresses */
if (via->port) port=atoi(via->port);
else port=SIP_PORT;
if (via->port) {
port=atoi(via->port);
if ((port<=0) || (port>65535)) port=SIP_PORT;
} else {
port=SIP_PORT;
}
if ( (memcmp(&addr_myself, &addr_via, sizeof(addr_myself))==0) &&
(port == configuration.sip_listen_port) ) {
@@ -356,7 +364,7 @@ int compare_callid(osip_call_id_t *cid1, osip_call_id_t *cid2) {
*/
if (cid1->host && cid2->host) {
/* have both hosts */
if (strcmp(cid1->host, cid2->host) != 0) goto mismatch;
if (strcasecmp(cid1->host, cid2->host) != 0) goto mismatch;
} else {
/* at least one host missing, make sure that both are empty */
if ( (cid1->host && (cid1->host[0]!='\0')) ||
@@ -391,7 +399,7 @@ int is_sipuri_local (sip_ticket_t *ticket) {
int found;
struct in_addr addr_uri, addr_myself;
int port;
int i;
int i, sts;
if (sip==NULL) {
ERROR("called is_sipuri_local with NULL sip");
@@ -409,7 +417,12 @@ int is_sipuri_local (sip_ticket_t *ticket) {
if (utils_inet_aton(sip->req_uri->host, &addr_uri) == 0) {
/* need name resolution */
get_ip_by_host(sip->req_uri->host, &addr_uri);
sts=get_ip_by_host(sip->req_uri->host, &addr_uri);
if (sts == STS_FAILURE) {
DEBUGC(DBCLASS_PROXY, "sip_gen_response: cannot resolve via [%s]",
sip->req_uri->host);
return STS_FALSE;
}
}
found=0;
@@ -426,6 +439,7 @@ int is_sipuri_local (sip_ticket_t *ticket) {
/* check the extracted HOST against my own host addresses */
if (sip->req_uri->port) {
port=atoi(sip->req_uri->port);
if ((port<=0) || (port>65535)) port=SIP_PORT;
} else {
port=SIP_PORT;
}
@@ -443,71 +457,6 @@ int is_sipuri_local (sip_ticket_t *ticket) {
}
/*
* check if a given request (outbound -> inbound) shall its
* request URI get rewritten based upon our UA knowledge
*
* RETURNS
* STS_TRUE if to be rewritten
* STS_FALSE otherwise
*/
int check_rewrite_rq_uri (osip_message_t *sip) {
int i, j, sts;
int dflidx;
osip_header_t *ua_hdr;
/* get index of default entry */
dflidx=(sizeof(RQ_rewrite)/sizeof(RQ_rewrite[0])) - 1;
/* check fort existence of method */
if ((sip==NULL) ||
(sip->sip_method==NULL)) {
ERROR("check_rewrite_rq_uri: got NULL method");
return STS_FALSE;
}
/* extract UA string */
osip_message_get_user_agent (sip, 0, &ua_hdr);
if ((ua_hdr==NULL) || (ua_hdr->hvalue==NULL)) {
DEBUGC(DBCLASS_SIP, "check_rewrite_rq_uri: NULL UA in Header, "
"using default");
i=dflidx;
} else {
/* loop through the knowledge base */
for (i=0; RQ_rewrite[i].UAstring; i++) {
if (strncmp(RQ_rewrite[i].UAstring, ua_hdr->hvalue,
sizeof(RQ_rewrite[i].UAstring))==0) {
DEBUGC(DBCLASS_SIP, "got knowledge entry for [%s]",
ua_hdr->hvalue);
break;
}
} /* for i */
} /* if ua_hdr */
for (j=0; RQ_method[j].name; j++) {
if (strncmp(RQ_method[j].name,
sip->sip_method, RQ_method[j].size)==0) {
if (RQ_rewrite[i].action[j] >= 0) {
sts = (RQ_rewrite[i].action[j])? STS_TRUE: STS_FALSE;
} else {
sts = (RQ_rewrite[dflidx].action[j])? STS_TRUE: STS_FALSE;
}
DEBUGC(DBCLASS_SIP, "check_rewrite_rq_uri: [%s:%s, i=%i, j=%i] "
"got action %s",
(sip && sip->sip_method) ?
sip->sip_method : "*NULL*",
(ua_hdr && ua_hdr->hvalue)? ua_hdr->hvalue:"*NULL*",
i, j, (sts==STS_TRUE)? "rewrite":"norewrite");
return sts;
}
} /* for j */
WARN("check_rewrite_rq_uri: didn't get a hit of the method [%s]",
sip->sip_method);
return STS_FALSE;
}
/*
* SIP_GEN_RESPONSE
*
@@ -539,6 +488,7 @@ int sip_gen_response(sip_ticket_t *ticket, int code) {
if (via == NULL)
{
ERROR("sip_gen_response: Cannot send response - no via field");
osip_message_free(response);
return STS_FAILURE;
}
@@ -552,6 +502,7 @@ int sip_gen_response(sip_ticket_t *ticket, int code) {
if (sts == STS_FAILURE) {
DEBUGC(DBCLASS_PROXY, "sip_gen_response: cannot resolve via [%s]",
via->host);
osip_message_free(response);
return STS_FAILURE;
}
}
@@ -559,12 +510,14 @@ int sip_gen_response(sip_ticket_t *ticket, int code) {
sts = sip_message_to_str(response, &buffer, &buflen);
if (sts != 0) {
ERROR("sip_gen_response: msg_2char failed");
osip_message_free(response);
return STS_FAILURE;
}
if (via->port) {
port=atoi(via->port);
if ((port<=0) || (port>65535)) port=SIP_PORT;
} else {
port=SIP_PORT;
}
@@ -930,7 +883,7 @@ int sip_find_outbound_proxy(sip_ticket_t *ticket, struct in_addr *addr,
* first match wins
*/
for (i=0; i<configuration.outbound_proxy_domain_name.used; i++) {
if (strcmp(configuration.outbound_proxy_domain_name.string[i],
if (strcasecmp(configuration.outbound_proxy_domain_name.string[i],
domain)==0) {
sts = get_ip_by_host(configuration.outbound_proxy_domain_host.string[i],
addr);
@@ -941,7 +894,7 @@ int sip_find_outbound_proxy(sip_ticket_t *ticket, struct in_addr *addr,
return STS_FAILURE;
}
*port=atoi(configuration.outbound_proxy_domain_port.string[i]);
if (*port == 0) *port = SIP_PORT;
if ((*port<=0) || (*port>65535)) *port=SIP_PORT;
return STS_SUCCESS;
@@ -1110,12 +1063,12 @@ int sip_find_direction(sip_ticket_t *ticket, int *urlidx) {
port_via=0;
if (via->port) port_via=atoi(via->port);
if (port_via <= 0) port_via=SIP_PORT;
if ((port_via<=0) || (port_via>65535)) port_via=SIP_PORT;
port_ua=0;
if (urlmap[i].true_url->port)
port_ua=atoi(urlmap[i].true_url->port);
if (port_ua <= 0) port_ua=SIP_PORT;
if ((port_ua<=0) || (port_ua>65535)) port_ua=SIP_PORT;
DEBUGC(DBCLASS_SIP, "sip_find_direction: checking for registered "
"host [%s:%i] <-> [%s:%i]",
+4 -1
View File
@@ -152,7 +152,7 @@ int main (int argc, char *argv[])
case 'c': /* load config file */
DEBUGC(DBCLASS_CONFIG,"option: config file=%s",optarg);
i=sizeof(configfile)-1;
strncpy(configfile,optarg,i-1);
strncpy(configfile,optarg,i);
configfile[i]='\0';
config_search=0;
break;
@@ -369,6 +369,8 @@ int main (int argc, char *argv[])
osip_message_get_max_forwards(ticket.sipmsg, 0, &max_forwards);
if (max_forwards && max_forwards->hvalue) {
forwards_count = atoi(max_forwards->hvalue);
if ((forwards_count<=0)||
(forwards_count>=LONG_MAX)) forwards_count=DEFAULT_MAXFWD;
}
DEBUGC(DBCLASS_PROXY,"checking Max-Forwards (=%i)",forwards_count);
@@ -455,6 +457,7 @@ int main (int argc, char *argv[])
url = osip_message_get_uri(ticket.sipmsg);
dest_port= (url->port)?atoi(url->port):SIP_PORT;
if ((dest_port <=0) || (dest_port >65535)) dest_port=SIP_PORT;
if ( (get_ip_by_host(url->host, &addr1) == STS_SUCCESS) &&
(get_interface_ip(IF_INBOUND,&addr2) == STS_SUCCESS) &&
+1 -2
View File
@@ -23,7 +23,7 @@
#ifdef DMALLOC
#include <dmalloc.h>
#endif
#include <limits.h>
/*
* table to hold the client registrations
@@ -167,7 +167,6 @@ int is_via_local (osip_via_t *via); /*X*/
int compare_url(osip_uri_t *url1, osip_uri_t *url2); /*X*/
int compare_callid(osip_call_id_t *cid1, osip_call_id_t *cid2); /*X*/
int is_sipuri_local (sip_ticket_t *ticket); /*X*/
int check_rewrite_rq_uri (osip_message_t *sip); /*X*/
int sip_gen_response(sip_ticket_t *ticket, int code); /*X*/
int sip_add_myvia (sip_ticket_t *ticket, int interface); /*X*/
int sip_del_myvia (sip_ticket_t *ticket); /*X*/
+1 -1
View File
@@ -108,7 +108,7 @@ int get_ip_by_host(char *hostname, struct in_addr *addr) {
*/
for (i=0; i<DNS_CACHE_SIZE; i++) {
if (dns_cache[i].hostname[0]=='\0') continue; /* empty */
if (strcmp(hostname, dns_cache[i].hostname) == 0) { /* match */
if (strcasecmp(hostname, dns_cache[i].hostname) == 0) { /* match */
memcpy(addr, &dns_cache[i].addr, sizeof(struct in_addr));
DEBUGC(DBCLASS_DNS, "DNS lookup - from cache: %s -> %s",
hostname, utils_inet_ntoa(*addr));