diff options
author | Paul Moore <paul@paul-moore.com> | 2019-02-25 19:06:06 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-28 00:45:24 -0500 |
commit | 5578de4834fe0f2a34fedc7374be691443396d1f (patch) | |
tree | 57b5851e93a59389e6a1bb0cfaee81d1c586ba5f | |
parent | a1fd1ad2552fad9e649eeb85fd79301e2880a886 (diff) |
netlabel: fix out-of-bounds memory accesses
There are two array out-of-bounds memory accesses, one in
cipso_v4_map_lvl_valid(), the other in netlbl_bitmap_walk(). Both
errors are embarassingly simple, and the fixes are straightforward.
As a FYI for anyone backporting this patch to kernels prior to v4.8,
you'll want to apply the netlbl_bitmap_walk() patch to
cipso_v4_bitmap_walk() as netlbl_bitmap_walk() doesn't exist before
Linux v4.8.
Reported-by: Jann Horn <jannh@google.com>
Fixes: 446fda4f2682 ("[NetLabel]: CIPSOv4 engine")
Fixes: 3faa8f982f95 ("netlabel: Move bitmap manipulation functions to the NetLabel core.")
Signed-off-by: Paul Moore <paul@paul-moore.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv4/cipso_ipv4.c | 3 | ||||
-rw-r--r-- | net/netlabel/netlabel_kapi.c | 3 |
2 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index eff86a71c1b0..f0165c5f376b 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c | |||
@@ -667,7 +667,8 @@ static int cipso_v4_map_lvl_valid(const struct cipso_v4_doi *doi_def, u8 level) | |||
667 | case CIPSO_V4_MAP_PASS: | 667 | case CIPSO_V4_MAP_PASS: |
668 | return 0; | 668 | return 0; |
669 | case CIPSO_V4_MAP_TRANS: | 669 | case CIPSO_V4_MAP_TRANS: |
670 | if (doi_def->map.std->lvl.cipso[level] < CIPSO_V4_INV_LVL) | 670 | if ((level < doi_def->map.std->lvl.cipso_size) && |
671 | (doi_def->map.std->lvl.cipso[level] < CIPSO_V4_INV_LVL)) | ||
671 | return 0; | 672 | return 0; |
672 | break; | 673 | break; |
673 | } | 674 | } |
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index ea7c67050792..ee3e5b6471a6 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
@@ -903,7 +903,8 @@ int netlbl_bitmap_walk(const unsigned char *bitmap, u32 bitmap_len, | |||
903 | (state == 0 && (byte & bitmask) == 0)) | 903 | (state == 0 && (byte & bitmask) == 0)) |
904 | return bit_spot; | 904 | return bit_spot; |
905 | 905 | ||
906 | bit_spot++; | 906 | if (++bit_spot >= bitmap_len) |
907 | return -1; | ||
907 | bitmask >>= 1; | 908 | bitmask >>= 1; |
908 | if (bitmask == 0) { | 909 | if (bitmask == 0) { |
909 | byte = bitmap[++byte_offset]; | 910 | byte = bitmap[++byte_offset]; |