aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2013-03-20 18:15:26 +0100
committerMartin Willi <martin@revosec.ch>2013-05-06 16:10:11 +0200
commit344a4e54be887bb0ce8e32b5dbc29386a00d3887 (patch)
treedfafb7dab1869d3d6ce8fad2bdd115a1bff94dfc /src/libstrongswan
parent60ed88b2c7283a871ca80d8ed60f218d9731fa90 (diff)
downloadstrongswan-344a4e54be887bb0ce8e32b5dbc29386a00d3887.tar.bz2
strongswan-344a4e54be887bb0ce8e32b5dbc29386a00d3887.tar.xz
host: initialize sockaddr->sa_len if it is available
Diffstat (limited to 'src/libstrongswan')
-rw-r--r--src/libstrongswan/networking/host.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libstrongswan/networking/host.c b/src/libstrongswan/networking/host.c
index bffa96064..268d9b18e 100644
--- a/src/libstrongswan/networking/host.c
+++ b/src/libstrongswan/networking/host.c
@@ -54,6 +54,15 @@ struct private_host_t {
socklen_t socklen;
};
+/**
+ * Update the sockaddr internal sa_len option, if available
+ */
+static inline void update_sa_len(private_host_t *this)
+{
+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
+ this->address.sa_len = this->socklen;
+#endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */
+}
METHOD(host_t, get_sockaddr, sockaddr_t*,
private_host_t *this)
@@ -440,6 +449,7 @@ host_t *host_create_from_sockaddr(sockaddr_t *sockaddr)
memcpy(&this->address4, (struct sockaddr_in*)sockaddr,
sizeof(struct sockaddr_in));
this->socklen = sizeof(struct sockaddr_in);
+ update_sa_len(this);
return &this->public;
}
case AF_INET6:
@@ -447,6 +457,7 @@ host_t *host_create_from_sockaddr(sockaddr_t *sockaddr)
memcpy(&this->address6, (struct sockaddr_in6*)sockaddr,
sizeof(struct sockaddr_in6));
this->socklen = sizeof(struct sockaddr_in6);
+ update_sa_len(this);
return &this->public;
}
default:
@@ -529,6 +540,7 @@ host_t *host_create_from_chunk(int family, chunk_t address, u_int16_t port)
this->socklen = sizeof(struct sockaddr_in6);
break;
}
+ update_sa_len(this);
return &this->public;
}
@@ -582,11 +594,13 @@ host_t *host_create_any(int family)
case AF_INET:
{
this->socklen = sizeof(struct sockaddr_in);
+ update_sa_len(this);
return &(this->public);
}
case AF_INET6:
{
this->socklen = sizeof(struct sockaddr_in6);
+ update_sa_len(this);
return &this->public;
}
default: