Page MenuHomeFreeBSD

D58646.id183400.diff
No OneTemporary

D58646.id183400.diff

diff --git a/sys/netipsec/key.c b/sys/netipsec/key.c
--- a/sys/netipsec/key.c
+++ b/sys/netipsec/key.c
@@ -571,32 +571,57 @@
* set parameters into secpolicyindex buffer.
* Must allocate secpolicyindex buffer passed to this function.
*/
-#define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, idx) \
-do { \
- bzero((idx), sizeof(struct secpolicyindex)); \
- (idx)->dir = (_dir); \
- (idx)->prefs = (ps); \
- (idx)->prefd = (pd); \
- (idx)->ul_proto = (ulp); \
- bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \
- bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \
-} while (0)
+static void
+key_setsecspidx(uint8_t dir, const void *s, const void *d, uint8_t prefs,
+ uint8_t prefd, uint8_t ul_proto, struct secpolicyindex *idx)
+{
+ int alen;
+
+ memset(idx, 0, sizeof(*idx));
+ idx->dir = dir; \
+ idx->prefs = prefs;
+ idx->prefd = prefd;
+ idx->ul_proto = ul_proto;
+
+ alen = MIN(((const struct sockaddr *)s)->sa_len,
+ sizeof(union sockaddr_union));
+ memcpy(&idx->src, s, alen);
+ idx->src.sa.sa_len = alen;
+
+ alen = MIN(((const struct sockaddr *)d)->sa_len,
+ sizeof(union sockaddr_union));
+ memcpy(&idx->dst, d, alen);
+ idx->dst.sa.sa_len = alen;
+}
/*
* set parameters into secasindex buffer.
* Must allocate secasindex buffer before calling this function.
*/
-#define KEY_SETSECASIDX(p, m, r, s, d, idx) \
-do { \
- bzero((idx), sizeof(struct secasindex)); \
- (idx)->proto = (p); \
- (idx)->mode = (m); \
- (idx)->reqid = (r); \
- bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \
- bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \
- key_porttosaddr(&(idx)->src.sa, 0); \
- key_porttosaddr(&(idx)->dst.sa, 0); \
-} while (0)
+static void
+key_setsecasidx(uint8_t proto, uint8_t mode, uint32_t reqid,
+ const void *s, const void *d, struct secasindex *idx)
+{
+ int alen;
+
+ memset(idx, 0, sizeof(*idx));
+ idx->proto = proto;
+ idx->mode = mode;
+ idx->reqid = reqid;
+
+ alen = MIN(((const struct sockaddr *)s)->sa_len,
+ sizeof(union sockaddr_union));
+ memcpy(&idx->src, s, alen);
+ idx->src.sa.sa_len = alen;
+
+ alen = MIN(((const struct sockaddr *)d)->sa_len,
+ sizeof(union sockaddr_union));
+ memcpy(&idx->dst, d, alen);
+ idx->dst.sa.sa_len = alen;
+
+ key_porttosaddr(&idx->src.sa, 0);
+ key_porttosaddr(&idx->dst.sa, 0);
+}
/* key statistics */
struct _keystat {
@@ -1206,7 +1231,7 @@
IPSEC_ASSERT(src != NULL, ("null src address"));
IPSEC_ASSERT(dst != NULL, ("null dst address"));
- KEY_SETSECASIDX(proto, IPSEC_MODE_TUNNEL, 0, &src->sa,
+ key_setsecasidx(proto, IPSEC_MODE_TUNNEL, 0, &src->sa,
&dst->sa, &saidx);
sav = NULL;
@@ -2107,13 +2132,9 @@
return key_senderror(so, m, error);
}
/* make secindex */
- KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
- src0 + 1,
- dst0 + 1,
- src0->sadb_address_prefixlen,
- dst0->sadb_address_prefixlen,
- src0->sadb_address_proto,
- &spidx);
+ key_setsecspidx(xpl0->sadb_x_policy_dir, src0 + 1, dst0 + 1,
+ src0->sadb_address_prefixlen, dst0->sadb_address_prefixlen,
+ src0->sadb_address_proto, &spidx);
/* Checking there is SP already or not. */
oldsp = key_getsp(&spidx);
if (oldsp != NULL) {
@@ -2348,13 +2369,9 @@
return key_senderror(so, m, EINVAL);
}
/* make secindex */
- KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir,
- src0 + 1,
- dst0 + 1,
- src0->sadb_address_prefixlen,
- dst0->sadb_address_prefixlen,
- src0->sadb_address_proto,
- &spidx);
+ key_setsecspidx(xpl0->sadb_x_policy_dir, src0 + 1, dst0 + 1,
+ src0->sadb_address_prefixlen, dst0->sadb_address_prefixlen,
+ src0->sadb_address_proto, &spidx);
/* Is there SP in SPD ? */
if ((sp = key_getsp(&spidx)) == NULL) {
@@ -5118,7 +5135,7 @@
error = EINVAL;
goto fail;
}
- KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+ key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
/* SPI allocation */
SPI_ALLOC_LOCK();
@@ -5355,21 +5372,25 @@
struct secashead *sah;
struct secasvar *newsav, *tmp;
struct mbuf *n;
- int error, isnew;
+ int alen, error, isnew;
/* Check that we need to change SAH */
if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_SRC)) {
newaddr = (struct sockaddr *)(
((struct sadb_address *)
mhp->ext[SADB_X_EXT_NEW_ADDRESS_SRC]) + 1);
- bcopy(newaddr, &saidx->src, newaddr->sa_len);
+ alen = MIN(sizeof(union sockaddr_union), newaddr->sa_len);
+ bcopy(newaddr, &saidx->src, alen);
+ saidx->src.sa.sa_len = alen;
key_porttosaddr(&saidx->src.sa, 0);
}
if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_DST)) {
newaddr = (struct sockaddr *)(
((struct sadb_address *)
mhp->ext[SADB_X_EXT_NEW_ADDRESS_DST]) + 1);
- bcopy(newaddr, &saidx->dst, newaddr->sa_len);
+ alen = MIN(sizeof(union sockaddr_union), newaddr->sa_len);
+ bcopy(newaddr, &saidx->dst, alen);
+ saidx->dst.sa.sa_len = alen;
key_porttosaddr(&saidx->dst.sa, 0);
}
if (!SADB_CHECKHDR(mhp, SADB_X_EXT_NEW_ADDRESS_SRC) ||
@@ -5637,7 +5658,7 @@
ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
return key_senderror(so, m, error);
}
- KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+ key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
sav = key_getsavbyspi(sa0->sadb_sa_spi);
if (sav == NULL) {
ipseclog((LOG_DEBUG, "%s: no SA found for SPI %u\n",
@@ -5870,7 +5891,7 @@
ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
return key_senderror(so, m, error);
}
- KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+ key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
spi = sa0->sadb_sa_spi;
/*
* For TCP-MD5 SAs we don't use SPI. Check the uniqueness using
@@ -6325,7 +6346,7 @@
ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
return (key_senderror(so, m, EINVAL));
}
- KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx);
+ key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx);
if (SADB_CHECKHDR(mhp, SADB_EXT_SA)) {
/*
* Caller wants us to delete all non-LARVAL SAs
@@ -6556,7 +6577,7 @@
ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
return key_senderror(so, m, EINVAL);
}
- KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx);
+ key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx);
SPI_ALLOC_LOCK();
if (proto == IPPROTO_TCP)
@@ -7373,7 +7394,7 @@
ipseclog((LOG_DEBUG, "%s: invalid sockaddr.\n", __func__));
return key_senderror(so, m, EINVAL);
}
- KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
+ key_setsecasidx(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx);
/* get a SA index */
SAHTREE_RLOCK();

File Metadata

Mime Type
text/plain
Expires
Thu, Oct 15, 5:43 PM (7 m, 57 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36050394
Default Alt Text
D58646.id183400.diff (7 KB)

Event Timeline