diff --git a/core/sip/resolver.cpp b/core/sip/resolver.cpp index 98fb760e..38982f8a 100644 --- a/core/sip/resolver.cpp +++ b/core/sip/resolver.cpp @@ -732,14 +732,14 @@ sip_target::sip_target(const sip_target& target) const sip_target& sip_target::operator = (const sip_target& target) { - memcpy(&ss,&target.ss,sizeof(sockaddr_storage)); + ss = target.ss; memcpy(trsp,target.trsp,SIP_TRSP_SIZE_MAX+1); return target; } void sip_target::clear() { - memset(&ss,0,sizeof(sockaddr_storage)); + ss = sockaddr_storage{}; memset(trsp,'\0',SIP_TRSP_SIZE_MAX+1); } @@ -758,7 +758,7 @@ bool sip_target_set::has_next() return dest_list_it != dest_list.end(); } -int sip_target_set::get_next(sockaddr_storage* ss, cstring& next_trsp, +int sip_target_set::get_next(sockaddr_storage& ss, cstring& next_trsp, unsigned int flags) { do { @@ -766,7 +766,7 @@ int sip_target_set::get_next(sockaddr_storage* ss, cstring& next_trsp, return -1; sip_target& t = *dest_list_it; - memcpy(ss,&t.ss,sizeof(sockaddr_storage)); + ss = t.ss; next_trsp = cstring(t.trsp); next(); diff --git a/core/sip/resolver.h b/core/sip/resolver.h index 3e461236..c8979c02 100644 --- a/core/sip/resolver.h +++ b/core/sip/resolver.h @@ -228,7 +228,7 @@ struct sip_target_set void reset_iterator(); bool has_next(); - int get_next(sockaddr_storage* ss, cstring& next_trsp, + int get_next(sockaddr_storage& ss, cstring& next_trsp, unsigned int flags); bool next(); diff --git a/core/sip/tr_blacklist.cpp b/core/sip/tr_blacklist.cpp index 696f79c8..bfe78f9d 100644 --- a/core/sip/tr_blacklist.cpp +++ b/core/sip/tr_blacklist.cpp @@ -13,17 +13,7 @@ bl_addr::bl_addr() ss_family = AF_INET; } -bl_addr::bl_addr(const bl_addr& addr) -{ - memcpy(this,&addr,SA_len(&addr)); -} - -bl_addr::bl_addr(const sockaddr_storage* p_addr) -{ - memcpy((sockaddr_storage*)this,p_addr,SA_len(p_addr)); -} - -unsigned int bl_addr::hash() +unsigned int bl_addr::hash() const { return hashlittle((sockaddr_storage*)this, SA_len(this), 0) & BLACKLIST_HT_MASK; @@ -33,7 +23,7 @@ void bl_timer::fire() { DBG_BL("blacklist: %s/%i expired", am_inet_ntop(&addr).c_str(),am_get_port(&addr)); - tr_blacklist::instance()->remove(&addr); + tr_blacklist::instance()->remove(addr); } bool blacklist_bucket::insert(const bl_addr& addr, uint64_t duration /* ms */, @@ -82,38 +72,41 @@ tr_blacklist::~tr_blacklist() { } -bool tr_blacklist::exist(const sockaddr_storage* addr) +bool tr_blacklist::exist(const sockaddr_storage& addr) { bool res; - blacklist_bucket* bucket = get_bucket(hashlittle(addr, SA_len(addr), 0) - & BLACKLIST_HT_MASK); + const bl_addr& bl_a = static_cast(addr); + + blacklist_bucket* bucket = get_bucket(bl_a.hash()); bucket->lock(); - res = bucket->exist(*(const bl_addr*)addr); + res = bucket->exist(bl_a); bucket->unlock(); return res; } -void tr_blacklist::insert(const sockaddr_storage* addr, unsigned int duration, +void tr_blacklist::insert(const sockaddr_storage& addr, unsigned int duration, const char* reason) { if(!duration) return; - blacklist_bucket* bucket = get_bucket(hashlittle(addr, SA_len(addr), 0) - & BLACKLIST_HT_MASK); + const bl_addr& bl_a = static_cast(addr); + + blacklist_bucket* bucket = get_bucket(bl_a.hash()); bucket->lock(); - if(!bucket->exist(*(const bl_addr*)addr)) { - bucket->insert(*(const bl_addr*)addr,duration,reason); + if(!bucket->exist(bl_a)) { + bucket->insert(bl_a,duration,reason); } bucket->unlock(); } -void tr_blacklist::remove(const sockaddr_storage* addr) +void tr_blacklist::remove(const sockaddr_storage& addr) { - blacklist_bucket* bucket = get_bucket(hashlittle(addr, SA_len(addr), 0) - & BLACKLIST_HT_MASK); + const bl_addr& bl_a = static_cast(addr); + + blacklist_bucket* bucket = get_bucket(bl_a.hash()); bucket->lock(); - bucket->remove(*(const bl_addr*)addr); + bucket->remove(bl_a); bucket->unlock(); } diff --git a/core/sip/tr_blacklist.h b/core/sip/tr_blacklist.h index cb18d9cd..01a125de 100644 --- a/core/sip/tr_blacklist.h +++ b/core/sip/tr_blacklist.h @@ -15,10 +15,8 @@ struct bl_addr: public sockaddr_storage { bl_addr(); - bl_addr(const bl_addr&); - bl_addr(const sockaddr_storage*); - unsigned int hash(); + unsigned int hash() const; }; template<> struct std::less { @@ -122,10 +120,10 @@ protected: public: // public blacklist API: - bool exist(const sockaddr_storage* addr); - void insert(const sockaddr_storage* addr, unsigned int duration /* ms */, + bool exist(const sockaddr_storage& addr); + void insert(const sockaddr_storage& addr, unsigned int duration /* ms */, const char* reason); - void remove(const sockaddr_storage* addr); + void remove(const sockaddr_storage& addr); }; #endif diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp index 50077bdc..adbc5331 100644 --- a/core/sip/trans_layer.cpp +++ b/core/sip/trans_layer.cpp @@ -1270,7 +1270,7 @@ int trans_layer::send_request(sip_msg* msg, trans_ticket* tt, tt->_t = 0; try_next_dest: - if(targets->get_next(&msg->remote_ip,next_trsp,flags) < 0) { + if(targets->get_next(msg->remote_ip, next_trsp, flags) < 0) { DBG("next_ip(): no more destinations! reply 500"); sip_msg err; set_err_reply_from_req(&err,msg,500, @@ -1305,7 +1305,7 @@ int trans_layer::send_request(sip_msg* msg, trans_ticket* tt, ERROR("Error from transport layer\n"); if(default_bl_ttl) { - tr_blacklist::instance()->insert(&p_msg->remote_ip, + tr_blacklist::instance()->insert(p_msg->remote_ip, default_bl_ttl,"503"); } @@ -1852,7 +1852,7 @@ int trans_layer::update_uac_reply(trans_bucket* bucket, sip_trans* t, sip_msg* m t->state == TS_PROCEEDING)) { if(!(t->flags & TR_FLAG_DISABLE_BL)) { - tr_blacklist::instance()->insert(&t->msg->remote_ip, + tr_blacklist::instance()->insert(t->msg->remote_ip, default_bl_ttl,"503"); } @@ -1984,7 +1984,7 @@ int trans_layer::update_uac_reply(trans_bucket* bucket, sip_trans* t, sip_msg* m if(reply_code == 503) { if(default_bl_ttl) { - tr_blacklist::instance()->insert(&t->msg->remote_ip, + tr_blacklist::instance()->insert(t->msg->remote_ip, default_bl_ttl,"503"); } if(!try_next_ip(bucket,t,false)) @@ -2521,7 +2521,7 @@ void trans_layer::timer_expired(trans_timer* t, trans_bucket* bucket, if(!(tr->flags & TR_FLAG_DISABLE_BL)) { // insert destination to blacklist if(default_bl_ttl) { - tr_blacklist::instance()->insert(&tr->msg->remote_ip, + tr_blacklist::instance()->insert(tr->msg->remote_ip, default_bl_ttl, "timeout"); } @@ -2627,7 +2627,7 @@ int trans_layer::try_next_ip(trans_bucket* bucket, sip_trans* tr, try_next_dest: // get the next ip if(!tr->targets || - tr->targets->get_next(&sa,next_trsp,tr->flags) < 0){ + tr->targets->get_next(sa, next_trsp, tr->flags) < 0){ DBG("no more destinations!"); return -1; } @@ -2741,7 +2741,7 @@ int trans_layer::try_next_ip(trans_bucket* bucket, sip_trans* tr, ERROR("Error from transport layer\n"); if(default_bl_ttl) { - tr_blacklist::instance()->insert(&tr->msg->remote_ip, + tr_blacklist::instance()->insert(tr->msg->remote_ip, default_bl_ttl,"503"); }