Skip to content

Commit 05a5d66

Browse files
zx2c4syphyr
authored andcommitted
wireguard: allowedips: expand maximum node depth
commit 46622219aae2b67813fe31a7b8cb7da5baff5c8a upstream. In the allowedips self-test, nodes are inserted into the tree, but it generated an even amount of nodes, but for checking maximum node depth, there is of course the root node, which makes the total number necessarily odd. With two few nodes added, it never triggered the maximum depth check like it should have. So, add 129 nodes instead of 128 nodes, and do so with a more straightforward scheme, starting with all the bits set, and shifting over one each time. Then increase the maximum depth to 129, and choose a better name for that variable to make it clear that it represents depth as opposed to bits. Cc: stable@vger.kernel.org Fixes: e7096c131e51 ("net: WireGuard secure network tunnel") Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> Link: https://lore.kernel.org/r/20230807132146.2191597-2-Jason@zx2c4.com Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 39bb781 commit 05a5d66

File tree

2 files changed

+14
-10
lines changed

2 files changed

+14
-10
lines changed

src/allowedips.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "allowedips.h"
77
#include "peer.h"
88

9-
enum { MAX_ALLOWEDIPS_BITS = 128 };
9+
enum { MAX_ALLOWEDIPS_DEPTH = 129 };
1010

1111
static struct kmem_cache *node_cache;
1212

@@ -42,7 +42,7 @@ static void push_rcu(struct allowedips_node **stack,
4242
struct allowedips_node __rcu *p, unsigned int *len)
4343
{
4444
if (rcu_access_pointer(p)) {
45-
if (WARN_ON(IS_ENABLED(DEBUG) && *len >= MAX_ALLOWEDIPS_BITS))
45+
if (WARN_ON(IS_ENABLED(DEBUG) && *len >= MAX_ALLOWEDIPS_DEPTH))
4646
return;
4747
stack[(*len)++] = rcu_dereference_raw(p);
4848
}
@@ -55,7 +55,7 @@ static void node_free_rcu(struct rcu_head *rcu)
5555

5656
static void root_free_rcu(struct rcu_head *rcu)
5757
{
58-
struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_BITS] = {
58+
struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_DEPTH] = {
5959
container_of(rcu, struct allowedips_node, rcu) };
6060
unsigned int len = 1;
6161

@@ -68,7 +68,7 @@ static void root_free_rcu(struct rcu_head *rcu)
6868

6969
static void root_remove_peer_lists(struct allowedips_node *root)
7070
{
71-
struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_BITS] = { root };
71+
struct allowedips_node *node, *stack[MAX_ALLOWEDIPS_DEPTH] = { root };
7272
unsigned int len = 1;
7373

7474
while (len > 0 && (node = stack[--len])) {

src/selftest/allowedips.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -593,16 +593,20 @@ bool __init wg_allowedips_selftest(void)
593593
wg_allowedips_remove_by_peer(&t, a, &mutex);
594594
test_negative(4, a, 192, 168, 0, 1);
595595

596-
/* These will hit the WARN_ON(len >= MAX_ALLOWEDIPS_BITS) in free_node
596+
/* These will hit the WARN_ON(len >= MAX_ALLOWEDIPS_DEPTH) in free_node
597597
* if something goes wrong.
598598
*/
599-
for (i = 0; i < MAX_ALLOWEDIPS_BITS; ++i) {
600-
part = cpu_to_be64(~(1LLU << (i % 64)));
601-
memset(&ip, 0xff, 16);
602-
memcpy((u8 *)&ip + (i < 64) * 8, &part, 8);
599+
for (i = 0; i < 64; ++i) {
600+
part = cpu_to_be64(~0LLU << i);
601+
memset(&ip, 0xff, 8);
602+
memcpy((u8 *)&ip + 8, &part, 8);
603+
wg_allowedips_insert_v6(&t, &ip, 128, a, &mutex);
604+
memcpy(&ip, &part, 8);
605+
memset((u8 *)&ip + 8, 0, 8);
603606
wg_allowedips_insert_v6(&t, &ip, 128, a, &mutex);
604607
}
605-
608+
memset(&ip, 0, 16);
609+
wg_allowedips_insert_v6(&t, &ip, 128, a, &mutex);
606610
wg_allowedips_free(&t, &mutex);
607611

608612
wg_allowedips_init(&t);

0 commit comments

Comments
 (0)