]> git.ipfire.org Git - people/ms/strongswan.git/commitdiff
traffic-selector: Avoid out-of-bound array access when calculating range master
authorTobias Brunner <tobias@strongswan.org>
Wed, 16 Mar 2022 10:45:49 +0000 (11:45 +0100)
committerTobias Brunner <tobias@strongswan.org>
Wed, 16 Mar 2022 10:54:34 +0000 (11:54 +0100)
This happens for `/0` subnet masks.  In practice, it's not an issue because
if `bytes` is 0, then so are `netbits`, `bits` and `mask`.  So the two
incorrectly addressed array elements are not actually modified.  The first
operation is a `&= 0xff` and the second a `|= 0`, so nothing changes.
But some tools might not consider the values and report this as undefined
behavior, which it technically is.

src/libstrongswan/selectors/traffic_selector.c

index cfd2b029dbe2468934ddc56123d0dd190891cf72..2735a5cc16c3d4fae8d99ea014d3097662f759cc 100644 (file)
@@ -109,8 +109,12 @@ static void calc_range(private_traffic_selector_t *this, uint8_t netbits)
        memcpy(this->to, this->from, bytes);
        memset(this->from + bytes, 0x00, len - bytes);
        memset(this->to   + bytes, 0xff, len - bytes);
-       this->from[bytes-1] &= ~mask;
-       this->to[bytes-1]   |=  mask;
+
+       if (bytes)
+       {
+               this->from[bytes-1] &= ~mask;
+               this->to[bytes-1]   |=  mask;
+       }
 }
 
 /**