aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-20 21:53:27 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-20 21:53:27 +0000
commit21c939e10425914d3aab3e432024d76de162a251 (patch)
treed76859f285723e4d0a08674b5fa6cdb000773e60
parente3f00a93e4b0128514e9884e7e5291f61415cef1 (diff)
Fix some very broken code that was introduced in 1.2.26 as a part of the security
fix. The dnsmgr is not appropriate here. The dnsmgr takes a pointer to an address structure that a background thread continuously updates. However, in these cases, a stack variable was passed. That means that the dnsmgr thread would be continuously writing to bogus memory. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@110335 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_iax2.c12
-rw-r--r--channels/chan_sip.c11
2 files changed, 9 insertions, 14 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 820f474bd..9a47e22c5 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2657,9 +2657,9 @@ static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in
if (var && sin) {
for (tmp = var; tmp; tmp = tmp->next) {
if (!strcasecmp(tmp->name, "host")) {
- struct in_addr sin2 = { 0, };
- struct ast_dnsmgr_entry *dnsmgr = NULL;
- if ((ast_dnsmgr_lookup(tmp->value, &sin2, &dnsmgr) < 0) || (memcmp(&sin2, &sin->sin_addr, sizeof(sin2)) != 0)) {
+ struct ast_hostent ahp;
+ struct hostent *hp;
+ if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || (memcmp(&hp->h_addr, &sin->sin_addr, sizeof(hp->h_addr)))) {
/* No match */
ast_variables_destroy(var);
var = NULL;
@@ -2773,9 +2773,9 @@ static struct iax2_user *realtime_user(const char *username, struct sockaddr_in
if (var) {
for (tmp = var; tmp; tmp = tmp->next) {
if (!strcasecmp(tmp->name, "host")) {
- struct in_addr sin2 = { 0, };
- struct ast_dnsmgr_entry *dnsmgr = NULL;
- if ((ast_dnsmgr_lookup(tmp->value, &sin2, &dnsmgr) < 0) || (memcmp(&sin2, &sin->sin_addr, sizeof(sin2)) != 0)) {
+ struct ast_hostent ahp;
+ struct hostent *hp;
+ if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || (memcmp(&hp->h_addr, &sin->sin_addr, sizeof(hp->h_addr)))) {
/* No match */
ast_variables_destroy(var);
var = NULL;
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 27f925551..afd0c2211 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -78,10 +78,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/utils.h"
#include "asterisk/file.h"
#include "asterisk/astobj.h"
-#include "asterisk/dnsmgr.h"
#include "asterisk/devicestate.h"
#include "asterisk/linkedlists.h"
-#include "asterisk/dnsmgr.h"
#ifdef OSP_SUPPORT
#include "asterisk/astosp.h"
@@ -789,7 +787,6 @@ struct sip_peer {
int rtpkeepalive; /*!< Send RTP packets for keepalive */
ast_group_t callgroup; /*!< Call group */
ast_group_t pickupgroup; /*!< Pickup group */
- struct ast_dnsmgr_entry *dnsmgr;/*!< DNS refresh manager for peer */
struct sockaddr_in addr; /*!< IP address of peer */
/* Qualification */
@@ -1672,8 +1669,6 @@ static void sip_destroy_peer(struct sip_peer *peer)
speerobjs--;
clear_realm_authentication(peer->auth);
peer->auth = (struct sip_auth *) NULL;
- if (peer->dnsmgr)
- ast_dnsmgr_release(peer->dnsmgr);
free(peer);
}
@@ -1714,9 +1709,9 @@ static struct sip_peer *realtime_peer(const char *peername, struct sockaddr_in *
if (var) {
for (tmp = var; tmp; tmp = tmp->next) {
if (!strcasecmp(var->name, "host")) {
- struct in_addr sin2 = { 0, };
- struct ast_dnsmgr_entry *dnsmgr = NULL;
- if ((ast_dnsmgr_lookup(tmp->value, &sin2, &dnsmgr) < 0) || (memcmp(&sin2, &sin->sin_addr, sizeof(sin2)) != 0)) {
+ struct hostent *hp;
+ struct ast_hostent ahp;
+ if (!(hp = ast_gethostbyname(tmp->value, &ahp)) || (memcmp(&hp->h_addr, &sin->sin_addr, sizeof(hp->h_addr)))) {
/* No match */
ast_variables_destroy(var);
var = NULL;