MT#62181 transport: fix up socket usage

Zero is a valid file descriptor. Anything that's not -1 can in fact be a
valid file descriptor.

Make sure `sd` is set to -1 whenever no socket is open.

Add dtor to socket class to close the socket if it's open.

Add a few related formatting fixes as well.

Change-Id: Id9d3ad74b986c82ac6ab698a1e8f1f38e0f92414
mr13.3.1
Richard Fuchs 1 year ago
parent 8d0c121afc
commit 42a3ef3c62

@ -53,7 +53,7 @@ tcp_trsp_socket::tcp_trsp_socket(tcp_server_socket* server_sock,
// async parser state
pst.reset((char*)input_buf);
if(sd > 0) {
if(sd != -1) {
create_events();
}
}
@ -63,7 +63,7 @@ void tcp_trsp_socket::create_connected(tcp_server_socket* server_sock,
int sd, const sockaddr_storage* sa,
struct event_base* evbase)
{
if(sd < 0)
if(sd == -1)
return;
tcp_trsp_socket* sock = new tcp_trsp_socket(server_sock,server_worker,
@ -180,7 +180,7 @@ int tcp_trsp_socket::on_connect(short ev)
int tcp_trsp_socket::connect()
{
if(sd > 0) {
if(sd != -1) {
ERROR("pending connection request: close first.");
return -1;
}
@ -208,7 +208,7 @@ int tcp_trsp_socket::connect()
int tcp_trsp_socket::check_connection()
{
if(sd < 0){
if(sd == -1){
int ret = connect();
if(ret < 0) {
if(errno != EINPROGRESS && errno != EALREADY) {
@ -270,7 +270,7 @@ void tcp_trsp_socket::close()
event_del(read_ev);
event_del(write_ev);
if(sd > 0) {
if(sd != -1) {
::close(sd);
sd = -1;
}
@ -604,6 +604,7 @@ int tcp_server_socket::bind(const string& bind_ip, unsigned short bind_port)
if(sd){
WARN("re-binding socket\n");
close(sd);
sd = -1;
}
if(am_inet_pton(bind_ip.c_str(),&addr) == 0){
@ -633,26 +634,22 @@ int tcp_server_socket::bind(const string& bind_ip, unsigned short bind_port)
(void*)&true_opt, sizeof (true_opt)) == -1) {
ERROR("%s\n",strerror(errno));
close(sd);
return -1;
}
if(ioctl(sd, FIONBIO , &true_opt) == -1) {
ERROR("setting non-blocking: %s\n",strerror(errno));
close(sd);
return -1;
}
if(::bind(sd,(const struct sockaddr*)&addr,SA_len(&addr)) < 0) {
ERROR("bind: %s\n",strerror(errno));
close(sd);
return -1;
}
if(::listen(sd, 16) < 0) {
ERROR("listen: %s\n",strerror(errno));
close(sd);
return -1;
}
@ -797,7 +794,7 @@ tcp_trsp::~tcp_trsp()
void tcp_trsp::run()
{
int server_sd = sock->get_sd();
if(server_sd <= 0){
if(server_sd == -1){
ERROR("Transport instance not bound\n");
return;
}

@ -270,7 +270,7 @@ public:
class tcp_trsp: public transport
{
struct event_base *evbase;
struct event_base* evbase;
protected:
/** @see AmThread */

@ -46,6 +46,8 @@ trsp_socket::trsp_socket(unsigned short if_num, unsigned int opts,
trsp_socket::~trsp_socket()
{
if (sd != -1)
close(sd);
}
const char* trsp_socket::get_ip() const

@ -79,7 +79,7 @@ protected:
public:
trsp_socket(unsigned short if_num, unsigned int opts,
unsigned int sys_if_idx = 0, int sd = 0);
unsigned int sys_if_idx = 0, int sd = -1);
virtual ~trsp_socket();
/**

@ -51,9 +51,10 @@
/** @see trsp_socket */
int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port)
{
if(sd){
if(sd != -1){
WARN("re-binding socket\n");
close(sd);
sd = -1;
}
if(am_inet_pton(bind_ip.c_str(),&addr) == 0){
@ -76,12 +77,11 @@ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port)
if((sd = socket(addr.ss_family,SOCK_DGRAM,0)) == -1){
ERROR("socket: %s\n",strerror(errno));
return -1;
}
}
if(::bind(sd,(const struct sockaddr*)&addr,SA_len(&addr))) {
ERROR("bind: %s\n",strerror(errno));
close(sd);
return -1;
}
@ -92,7 +92,6 @@ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port)
(void*)&true_opt, sizeof (true_opt)) == -1) {
ERROR("%s\n",strerror(errno));
close(sd);
return -1;
}
} else {
@ -100,7 +99,6 @@ int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port)
(void*)&true_opt, sizeof (true_opt)) == -1) {
ERROR("%s\n",strerror(errno));
close(sd);
return -1;
}
}
@ -138,7 +136,7 @@ int udp_trsp_socket::set_recvbuf_size(int rcvbuf_size)
}
}
}
return 0;
}
@ -230,7 +228,7 @@ int udp_trsp_socket::send(const sockaddr_storage* sa,
unsigned int flags)
{
if (log_level_raw_msgs >= 0) {
_LOG(log_level_raw_msgs,
_LOG(log_level_raw_msgs,
"send msg to %s:%i\n--++--\n%.*s--++--\n",
get_addr_str(sa).c_str(),
ntohs(((sockaddr_in*)sa)->sin_port),
@ -241,7 +239,7 @@ int udp_trsp_socket::send(const sockaddr_storage* sa,
return raw_sender::send(msg,msg_len,sys_if_idx,&addr,sa);
if(socket_options & force_outbound_if)
return sendmsg(sa,msg,msg_len);
return sendmsg(sa,msg,msg_len);
return sendto(sa,msg,msg_len);
}
@ -276,7 +274,7 @@ void udp_trsp::run()
{
int buf_len;
if(sock->get_sd()<=0){
if(sock->get_sd() == -1){
ERROR("Transport instance not bound\n");
return;
}
@ -318,7 +316,7 @@ void udp_trsp::run()
if (trsp_socket::log_level_raw_msgs >= 0) {
char host[NI_MAXHOST] = "";
_LOG(trsp_socket::log_level_raw_msgs,
_LOG(trsp_socket::log_level_raw_msgs,
"vv M [|] u recvd msg via UDP from %s:%i vv\n"
"--++--\n%.*s--++--\n",
am_inet_ntop_sip(&s_msg->remote_ip,host,NI_MAXHOST),
@ -332,10 +330,10 @@ void udp_trsp::run()
for (cmsghdr* cmsgptr = CMSG_FIRSTHDR(&msg);
cmsgptr != NULL;
cmsgptr = CMSG_NXTHDR(&msg, cmsgptr)) {
if (cmsgptr->cmsg_level == IPPROTO_IP &&
cmsgptr->cmsg_type == DSTADDR_SOCKOPT) {
s_msg->local_ip.ss_family = AF_INET;
am_set_port(&s_msg->local_ip,sock->get_port());
memcpy(&((sockaddr_in*)(&s_msg->local_ip))->sin_addr,
@ -354,6 +352,9 @@ void udp_trsp::run()
// pass message to the parser / transaction layer
trans_layer::instance()->received_msg(s_msg);
}
INFO("Stopped SIP server UDP transport on %s:%i\n",
sock->get_ip(),sock->get_port());
}
/** @see AmThread */
@ -362,7 +363,6 @@ void udp_trsp::on_stop()
}
/** EMACS **
* Local variables:

Loading…
Cancel
Save