diff mbox series

checkpolicy: Check the right bits of an ibpkeycon rule subnet prefix

Message ID 20240708165032.86647-1-jwcart2@gmail.com (mailing list archive)
State Accepted
Delegated to: Petr Lautrbach
Headers show
Series checkpolicy: Check the right bits of an ibpkeycon rule subnet prefix | expand

Commit Message

James Carter July 8, 2024, 4:50 p.m. UTC
The lower 64 bits of the subnet prefix for an ibpkeycon rule should
all be 0's. Unfortunately the check uses the s6_addr macro which refers
to the 16 entry array of 8-bit values in the union and does not refer
to the correct bits.

Use the s6_addr32 macro instead which refers to the 4 entry array of
32-bit values in the union and refers to the lower 64 bits.

Signed-off-by: James Carter <jwcart2@gmail.com>
---
 checkpolicy/policy_define.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Stephen Smalley July 29, 2024, 3:28 p.m. UTC | #1
On Mon, Jul 8, 2024 at 12:50 PM James Carter <jwcart2@gmail.com> wrote:
>
> The lower 64 bits of the subnet prefix for an ibpkeycon rule should
> all be 0's. Unfortunately the check uses the s6_addr macro which refers
> to the 16 entry array of 8-bit values in the union and does not refer
> to the correct bits.
>
> Use the s6_addr32 macro instead which refers to the 4 entry array of
> 32-bit values in the union and refers to the lower 64 bits.
>
> Signed-off-by: James Carter <jwcart2@gmail.com>

Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>

> ---
>  checkpolicy/policy_define.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
> index 4931f23d..bfeda86b 100644
> --- a/checkpolicy/policy_define.c
> +++ b/checkpolicy/policy_define.c
> @@ -5036,7 +5036,7 @@ int define_ibpkey_context(unsigned int low, unsigned int high)
>                 goto out;
>         }
>
> -       if (subnet_prefix.s6_addr[2] || subnet_prefix.s6_addr[3]) {
> +       if (subnet_prefix.s6_addr32[2] || subnet_prefix.s6_addr32[3]) {
>                 yyerror("subnet prefix should be 0's in the low order 64 bits.");
>                 rc = -1;
>                 goto out;
> --
> 2.45.2
>
>
Stephen Smalley July 29, 2024, 3:38 p.m. UTC | #2
On Mon, Jul 29, 2024 at 11:28 AM Stephen Smalley
<stephen.smalley.work@gmail.com> wrote:
>
> On Mon, Jul 8, 2024 at 12:50 PM James Carter <jwcart2@gmail.com> wrote:
> >
> > The lower 64 bits of the subnet prefix for an ibpkeycon rule should
> > all be 0's. Unfortunately the check uses the s6_addr macro which refers
> > to the 16 entry array of 8-bit values in the union and does not refer
> > to the correct bits.
> >
> > Use the s6_addr32 macro instead which refers to the 4 entry array of
> > 32-bit values in the union and refers to the lower 64 bits.
> >
> > Signed-off-by: James Carter <jwcart2@gmail.com>
>
> Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>

One caveat here is that I believe this breaks building checkpolicy on
macOS because s6_addr32 is non-portable.
But it looks like a previous commit re-introduced the usage of
s6_addr32 (we had gotten rid of them earlier to avoid
needing ifdefs for macOS).

>
> > ---
> >  checkpolicy/policy_define.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
> > index 4931f23d..bfeda86b 100644
> > --- a/checkpolicy/policy_define.c
> > +++ b/checkpolicy/policy_define.c
> > @@ -5036,7 +5036,7 @@ int define_ibpkey_context(unsigned int low, unsigned int high)
> >                 goto out;
> >         }
> >
> > -       if (subnet_prefix.s6_addr[2] || subnet_prefix.s6_addr[3]) {
> > +       if (subnet_prefix.s6_addr32[2] || subnet_prefix.s6_addr32[3]) {
> >                 yyerror("subnet prefix should be 0's in the low order 64 bits.");
> >                 rc = -1;
> >                 goto out;
> > --
> > 2.45.2
> >
> >
Stephen Smalley July 29, 2024, 7:20 p.m. UTC | #3
On Mon, Jul 29, 2024 at 11:38 AM Stephen Smalley
<stephen.smalley.work@gmail.com> wrote:
>
> On Mon, Jul 29, 2024 at 11:28 AM Stephen Smalley
> <stephen.smalley.work@gmail.com> wrote:
> >
> > On Mon, Jul 8, 2024 at 12:50 PM James Carter <jwcart2@gmail.com> wrote:
> > >
> > > The lower 64 bits of the subnet prefix for an ibpkeycon rule should
> > > all be 0's. Unfortunately the check uses the s6_addr macro which refers
> > > to the 16 entry array of 8-bit values in the union and does not refer
> > > to the correct bits.
> > >
> > > Use the s6_addr32 macro instead which refers to the 4 entry array of
> > > 32-bit values in the union and refers to the lower 64 bits.
> > >
> > > Signed-off-by: James Carter <jwcart2@gmail.com>
> >
> > Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
>
> One caveat here is that I believe this breaks building checkpolicy on
> macOS because s6_addr32 is non-portable.
> But it looks like a previous commit re-introduced the usage of
> s6_addr32 (we had gotten rid of them earlier to avoid
> needing ifdefs for macOS).

Applied. We may need to revisit though at some point for macOS.
diff mbox series

Patch

diff --git a/checkpolicy/policy_define.c b/checkpolicy/policy_define.c
index 4931f23d..bfeda86b 100644
--- a/checkpolicy/policy_define.c
+++ b/checkpolicy/policy_define.c
@@ -5036,7 +5036,7 @@  int define_ibpkey_context(unsigned int low, unsigned int high)
 		goto out;
 	}
 
-	if (subnet_prefix.s6_addr[2] || subnet_prefix.s6_addr[3]) {
+	if (subnet_prefix.s6_addr32[2] || subnet_prefix.s6_addr32[3]) {
 		yyerror("subnet prefix should be 0's in the low order 64 bits.");
 		rc = -1;
 		goto out;