aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2017-03-02 11:51:27 +0100
committerTobias Brunner <tobias@strongswan.org>2017-03-02 11:54:39 +0100
commit9d8192bfcd74912600abc9417e392a0cb469260e (patch)
tree8e7648cf3b650aef66cf2f6b108c07d49c35d647
parentbb05b251b2ffbf97853796631319d61089926943 (diff)
downloadstrongswan-9d8192bfcd74912600abc9417e392a0cb469260e.tar.bz2
strongswan-9d8192bfcd74912600abc9417e392a0cb469260e.tar.xz
libipsec: Enforce a minimum of 256 for SPIs
RFC 4303 reserves the SPIs between 1 and 255 for future use. This also avoids an overflow and a division by zero if spi_min is 0 and spi_max is 0xffffffff.
-rw-r--r--src/libipsec/ipsec_sa_mgr.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/libipsec/ipsec_sa_mgr.c b/src/libipsec/ipsec_sa_mgr.c
index 314785f67..a1fa23e28 100644
--- a/src/libipsec/ipsec_sa_mgr.c
+++ b/src/libipsec/ipsec_sa_mgr.c
@@ -401,7 +401,7 @@ METHOD(ipsec_sa_mgr_t, get_spi, status_t,
uint32_t spi_min, spi_max, spi_new;
spi_min = lib->settings->get_int(lib->settings, "%s.spi_min",
- 0x00000000, lib->ns);
+ 0x00000100, lib->ns);
spi_max = lib->settings->get_int(lib->settings, "%s.spi_max",
0xffffffff, lib->ns);
if (spi_min > spi_max)
@@ -410,6 +410,9 @@ METHOD(ipsec_sa_mgr_t, get_spi, status_t,
spi_min = spi_max;
spi_max = spi_new;
}
+ /* make sure the SPI is valid (not in range 0-255) */
+ spi_min = max(spi_min, 0x00000100);
+ spi_max = max(spi_max, 0x00000100);
this->mutex->lock(this->mutex);
if (!this->rng)
@@ -433,8 +436,6 @@ METHOD(ipsec_sa_mgr_t, get_spi, status_t,
return FAILED;
}
spi_new = spi_min + spi_new % (spi_max - spi_min + 1);
- /* make sure the SPI is valid (not in range 0-255) */
- spi_new |= 0x00000100;
spi_new = htonl(spi_new);
}
while (!allocate_spi(this, spi_new));