summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Moore <paul@paul-moore.com>2019-02-25 19:06:06 -0500
committerDavid S. Miller <davem@davemloft.net>2019-02-28 00:45:24 -0500
commit5578de4834fe0f2a34fedc7374be691443396d1f (patch)
tree57b5851e93a59389e6a1bb0cfaee81d1c586ba5f
parenta1fd1ad2552fad9e649eeb85fd79301e2880a886 (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.c3
-rw-r--r--net/netlabel/netlabel_kapi.c3
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];