diff options
author | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-07-14 22:32:29 +0000 |
---|---|---|
committer | mmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-07-14 22:32:29 +0000 |
commit | ed3f5d37739a662cb08285e2230a7822ecc9173d (patch) | |
tree | f8f902d38011e82daa5eb6696813e6e08940de0d /channels/chan_sip.c | |
parent | 851016296bfff6fbd44631b4464d5e888105ffb2 (diff) |
Fix errors where incorrect address information was printed.
ast_sockaddr_stringiy_fmt (which is call by all ast_sockaddr_stringify* functions)
uses thread-local storage for storing the string that it creates. In cases where
ast_sockaddr_stringify_fmt was being called twice within the same statement, the
result of one call would be overwritten by the result of the other call. This
usually was happening in printf-like statements and was resulting in the same
stringified addressed being printed twice instead of two separate addresses.
I have fixed this by using ast_strdupa on the result of stringify functions if
they are used twice within the same statement. As far as I could tell, there were
no instances where a pointer to the result of such a call were saved anywhere, so
this is the only situation I could see where this error could occur.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@276570 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_sip.c')
-rw-r--r-- | channels/chan_sip.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6887e81f1..4189f53fe 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -13427,8 +13427,8 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock "Cause: AUTH_SECRET_FAILED\r\n" "Address: %s\r\n" "Port: %s\r\n", - name, ast_sockaddr_stringify_addr(addr), - ast_sockaddr_stringify_port(addr)); + name, ast_strdupa(ast_sockaddr_stringify_addr(addr)), + ast_strdupa(ast_sockaddr_stringify_port(addr))); } break; case AUTH_USERNAME_MISMATCH: @@ -13451,8 +13451,8 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock "Port: %s\r\n", name, res == AUTH_PEER_NOT_DYNAMIC ? "AUTH_PEER_NOT_DYNAMIC" : "URI_NOT_FOUND", - ast_sockaddr_stringify_addr(addr), - ast_sockaddr_stringify_port(addr)); + ast_strdupa(ast_sockaddr_stringify_addr(addr)), + ast_strdupa(ast_sockaddr_stringify_port(addr))); } } else { /* URI not found */ @@ -13467,8 +13467,8 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock "Address: %s\r\n" "Port: %s\r\n", name, - ast_sockaddr_stringify_addr(addr), - ast_sockaddr_stringify_port(addr)); + ast_strdupa(ast_sockaddr_stringify_addr(addr)), + ast_strdupa(ast_sockaddr_stringify_port(addr))); } } else { transmit_response(p, "404 Not found", &p->initreq); @@ -13482,8 +13482,8 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sock "Port: %s\r\n", name, (res == AUTH_USERNAME_MISMATCH) ? "AUTH_USERNAME_MISMATCH" : "URI_NOT_FOUND", - ast_sockaddr_stringify_addr(addr), - ast_sockaddr_stringify_port(addr)); + ast_strdupa(ast_sockaddr_stringify_addr(addr)), + ast_strdupa(ast_sockaddr_stringify_port(addr))); } } } @@ -27009,7 +27009,7 @@ static int apply_directmedia_ha(struct sip_pvt *p, const char *op) if ((res = ast_apply_ha(p->directmediaha, &them_sin)) == AST_SENSE_DENY) { ast_debug(3, "Reinvite %s to %s denied by directmedia ACL on %s\n", - op, ast_sockaddr_stringify(&them), ast_sockaddr_stringify(&us)); + op, ast_strdupa(ast_sockaddr_stringify(&them)), ast_strdupa(ast_sockaddr_stringify(&us))); } return res; |