Re: update explicit_bzero test to not assume SIGSTKSZ to be constant

2021-03-27 Thread Brent Cook
On Fri, Mar 26, 2021 at 1:56 PM Alexander Bluhm  wrote:
>
> On Mon, Mar 22, 2021 at 08:38:23PM -0500, Brent Cook wrote:
> > In the next version of Linux glibc, SIGSTKSZ is defined at runtime if
> > source is built with _GNU_SOURCE. On LibreSSL-portable, this is set to
> > bring in asprintf/vasprintf, which causes the explicit_bzero test to
> > fail to compile since the size of SIGSTKSZ is no longer known at compile
> > time. This adjusts the test to treat SIGSTKSZ as a runtime variable.
> >
> > See http://patches-tcwg.linaro.org/patch/48127/ and
> > https://github.com/libressl-portable/portable/issues/653 for the
> > LibreSSL build failure report on Fedora Rawhide.
> >
> > ok?
>
> OK bluhm@
>
> Could you put a comment there that SIGSTKSZ is not constant in GNU
> libc.  Then someone reading the test knows why we malloc.

Thanks for all of the feedback! I just committed with added comments
and clarifications.

>
> > Index: explicit_bzero.c
> > ===
> > RCS file: /cvs/src/regress/lib/libc/explicit_bzero/explicit_bzero.c,v
> > retrieving revision 1.6
> > diff -u -p -u -p -r1.6 explicit_bzero.c
> > --- explicit_bzero.c  11 Jul 2014 01:10:35 -  1.6
> > +++ explicit_bzero.c  23 Mar 2021 01:32:21 -
> > @@ -18,6 +18,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  #include 
> >  #include 
> >
> > @@ -36,16 +37,20 @@ enum {
> >   SECRETBYTES = SECRETCOUNT * sizeof(secret)
> >  };
> >
> > -static char altstack[SIGSTKSZ + SECRETBYTES];
> > +static char *altstack;
> > +#define ALTSTACK_SIZE (SIGSTKSZ + SECRETBYTES)
> >
> >  static void
> >  setup_stack(void)
> >  {
> > + altstack = malloc(ALTSTACK_SIZE);
> > +
> >   const stack_t sigstk = {
> >   .ss_sp = altstack,
> > - .ss_size = sizeof(altstack),
> > + .ss_size = ALTSTACK_SIZE
> >   };
> >
> > + ASSERT_NE(NULL, altstack);
> >   ASSERT_EQ(0, sigaltstack(, NULL));
> >  }
> >
> > @@ -129,7 +134,7 @@ test_without_bzero()
> >   char buf[SECRETBYTES];
> >   assert_on_stack();
> >   populate_secret(buf, sizeof(buf));
> > - char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
> > + char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
> >   ASSERT_NE(NULL, res);
> >   return (res);
> >  }
> > @@ -140,7 +145,7 @@ test_with_bzero()
> >   char buf[SECRETBYTES];
> >   assert_on_stack();
> >   populate_secret(buf, sizeof(buf));
> > - char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
> > + char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
> >   ASSERT_NE(NULL, res);
> >   explicit_bzero(buf, sizeof(buf));
> >   return (res);
> > @@ -183,14 +188,14 @@ main()
> >* on the stack.  This sanity checks that call_on_stack() and
> >* populate_secret() work as intended.
> >*/
> > - memset(altstack, 0, sizeof(altstack));
> > + memset(altstack, 0, ALTSTACK_SIZE);
> >   call_on_stack(do_test_without_bzero);
> >
> >   /*
> >* Now test with a call to explicit_bzero() and check that we
> >* *don't* find any instances of the secret data.
> >*/
> > - memset(altstack, 0, sizeof(altstack));
> > + memset(altstack, 0, ALTSTACK_SIZE);
> >   call_on_stack(do_test_with_bzero);
> >
> >   return (0);



Re: update explicit_bzero test to not assume SIGSTKSZ to be constant

2021-03-26 Thread Alexander Bluhm
On Mon, Mar 22, 2021 at 08:38:23PM -0500, Brent Cook wrote:
> In the next version of Linux glibc, SIGSTKSZ is defined at runtime if
> source is built with _GNU_SOURCE. On LibreSSL-portable, this is set to
> bring in asprintf/vasprintf, which causes the explicit_bzero test to
> fail to compile since the size of SIGSTKSZ is no longer known at compile
> time. This adjusts the test to treat SIGSTKSZ as a runtime variable.
> 
> See http://patches-tcwg.linaro.org/patch/48127/ and
> https://github.com/libressl-portable/portable/issues/653 for the
> LibreSSL build failure report on Fedora Rawhide.
> 
> ok?

OK bluhm@

Could you put a comment there that SIGSTKSZ is not constant in GNU
libc.  Then someone reading the test knows why we malloc.

> Index: explicit_bzero.c
> ===
> RCS file: /cvs/src/regress/lib/libc/explicit_bzero/explicit_bzero.c,v
> retrieving revision 1.6
> diff -u -p -u -p -r1.6 explicit_bzero.c
> --- explicit_bzero.c  11 Jul 2014 01:10:35 -  1.6
> +++ explicit_bzero.c  23 Mar 2021 01:32:21 -
> @@ -18,6 +18,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  
> @@ -36,16 +37,20 @@ enum {
>   SECRETBYTES = SECRETCOUNT * sizeof(secret)
>  };
>  
> -static char altstack[SIGSTKSZ + SECRETBYTES];
> +static char *altstack;
> +#define ALTSTACK_SIZE (SIGSTKSZ + SECRETBYTES)
>  
>  static void
>  setup_stack(void)
>  {
> + altstack = malloc(ALTSTACK_SIZE);
> +
>   const stack_t sigstk = {
>   .ss_sp = altstack,
> - .ss_size = sizeof(altstack),
> + .ss_size = ALTSTACK_SIZE
>   };
>  
> + ASSERT_NE(NULL, altstack);
>   ASSERT_EQ(0, sigaltstack(, NULL));
>  }
>  
> @@ -129,7 +134,7 @@ test_without_bzero()
>   char buf[SECRETBYTES];
>   assert_on_stack();
>   populate_secret(buf, sizeof(buf));
> - char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
> + char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
>   ASSERT_NE(NULL, res);
>   return (res);
>  }
> @@ -140,7 +145,7 @@ test_with_bzero()
>   char buf[SECRETBYTES];
>   assert_on_stack();
>   populate_secret(buf, sizeof(buf));
> - char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
> + char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
>   ASSERT_NE(NULL, res);
>   explicit_bzero(buf, sizeof(buf));
>   return (res);
> @@ -183,14 +188,14 @@ main()
>* on the stack.  This sanity checks that call_on_stack() and
>* populate_secret() work as intended.
>*/
> - memset(altstack, 0, sizeof(altstack));
> + memset(altstack, 0, ALTSTACK_SIZE);
>   call_on_stack(do_test_without_bzero);
>  
>   /*
>* Now test with a call to explicit_bzero() and check that we
>* *don't* find any instances of the secret data.
>*/
> - memset(altstack, 0, sizeof(altstack));
> + memset(altstack, 0, ALTSTACK_SIZE);
>   call_on_stack(do_test_with_bzero);
>  
>   return (0);



Re: update explicit_bzero test to not assume SIGSTKSZ to be constant

2021-03-22 Thread Theo de Raadt
Fine with me.

The malloc'd memory is not identical to bss memory, but this still matches
the spirit of the test.

Brent Cook  wrote:

> In the next version of Linux glibc, SIGSTKSZ is defined at runtime if
> source is built with _GNU_SOURCE. On LibreSSL-portable, this is set to
> bring in asprintf/vasprintf, which causes the explicit_bzero test to
> fail to compile since the size of SIGSTKSZ is no longer known at compile
> time. This adjusts the test to treat SIGSTKSZ as a runtime variable.
> 
> See http://patches-tcwg.linaro.org/patch/48127/ and
> https://github.com/libressl-portable/portable/issues/653 for the
> LibreSSL build failure report on Fedora Rawhide.
> 
> ok?
> 
> Index: explicit_bzero.c
> ===
> RCS file: /cvs/src/regress/lib/libc/explicit_bzero/explicit_bzero.c,v
> retrieving revision 1.6
> diff -u -p -u -p -r1.6 explicit_bzero.c
> --- explicit_bzero.c  11 Jul 2014 01:10:35 -  1.6
> +++ explicit_bzero.c  23 Mar 2021 01:32:21 -
> @@ -18,6 +18,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  
> @@ -36,16 +37,20 @@ enum {
>   SECRETBYTES = SECRETCOUNT * sizeof(secret)
>  };
>  
> -static char altstack[SIGSTKSZ + SECRETBYTES];
> +static char *altstack;
> +#define ALTSTACK_SIZE (SIGSTKSZ + SECRETBYTES)
>  
>  static void
>  setup_stack(void)
>  {
> + altstack = malloc(ALTSTACK_SIZE);
> +
>   const stack_t sigstk = {
>   .ss_sp = altstack,
> - .ss_size = sizeof(altstack),
> + .ss_size = ALTSTACK_SIZE
>   };
>  
> + ASSERT_NE(NULL, altstack);
>   ASSERT_EQ(0, sigaltstack(, NULL));
>  }
>  
> @@ -129,7 +134,7 @@ test_without_bzero()
>   char buf[SECRETBYTES];
>   assert_on_stack();
>   populate_secret(buf, sizeof(buf));
> - char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
> + char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
>   ASSERT_NE(NULL, res);
>   return (res);
>  }
> @@ -140,7 +145,7 @@ test_with_bzero()
>   char buf[SECRETBYTES];
>   assert_on_stack();
>   populate_secret(buf, sizeof(buf));
> - char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
> + char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
>   ASSERT_NE(NULL, res);
>   explicit_bzero(buf, sizeof(buf));
>   return (res);
> @@ -183,14 +188,14 @@ main()
>* on the stack.  This sanity checks that call_on_stack() and
>* populate_secret() work as intended.
>*/
> - memset(altstack, 0, sizeof(altstack));
> + memset(altstack, 0, ALTSTACK_SIZE);
>   call_on_stack(do_test_without_bzero);
>  
>   /*
>* Now test with a call to explicit_bzero() and check that we
>* *don't* find any instances of the secret data.
>*/
> - memset(altstack, 0, sizeof(altstack));
> + memset(altstack, 0, ALTSTACK_SIZE);
>   call_on_stack(do_test_with_bzero);
>  
>   return (0);
> 



update explicit_bzero test to not assume SIGSTKSZ to be constant

2021-03-22 Thread Brent Cook
In the next version of Linux glibc, SIGSTKSZ is defined at runtime if
source is built with _GNU_SOURCE. On LibreSSL-portable, this is set to
bring in asprintf/vasprintf, which causes the explicit_bzero test to
fail to compile since the size of SIGSTKSZ is no longer known at compile
time. This adjusts the test to treat SIGSTKSZ as a runtime variable.

See http://patches-tcwg.linaro.org/patch/48127/ and
https://github.com/libressl-portable/portable/issues/653 for the
LibreSSL build failure report on Fedora Rawhide.

ok?

Index: explicit_bzero.c
===
RCS file: /cvs/src/regress/lib/libc/explicit_bzero/explicit_bzero.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 explicit_bzero.c
--- explicit_bzero.c11 Jul 2014 01:10:35 -  1.6
+++ explicit_bzero.c23 Mar 2021 01:32:21 -
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -36,16 +37,20 @@ enum {
SECRETBYTES = SECRETCOUNT * sizeof(secret)
 };
 
-static char altstack[SIGSTKSZ + SECRETBYTES];
+static char *altstack;
+#define ALTSTACK_SIZE (SIGSTKSZ + SECRETBYTES)
 
 static void
 setup_stack(void)
 {
+   altstack = malloc(ALTSTACK_SIZE);
+
const stack_t sigstk = {
.ss_sp = altstack,
-   .ss_size = sizeof(altstack),
+   .ss_size = ALTSTACK_SIZE
};
 
+   ASSERT_NE(NULL, altstack);
ASSERT_EQ(0, sigaltstack(, NULL));
 }
 
@@ -129,7 +134,7 @@ test_without_bzero()
char buf[SECRETBYTES];
assert_on_stack();
populate_secret(buf, sizeof(buf));
-   char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
+   char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
ASSERT_NE(NULL, res);
return (res);
 }
@@ -140,7 +145,7 @@ test_with_bzero()
char buf[SECRETBYTES];
assert_on_stack();
populate_secret(buf, sizeof(buf));
-   char *res = memmem(altstack, sizeof(altstack), buf, sizeof(buf));
+   char *res = memmem(altstack, ALTSTACK_SIZE, buf, sizeof(buf));
ASSERT_NE(NULL, res);
explicit_bzero(buf, sizeof(buf));
return (res);
@@ -183,14 +188,14 @@ main()
 * on the stack.  This sanity checks that call_on_stack() and
 * populate_secret() work as intended.
 */
-   memset(altstack, 0, sizeof(altstack));
+   memset(altstack, 0, ALTSTACK_SIZE);
call_on_stack(do_test_without_bzero);
 
/*
 * Now test with a call to explicit_bzero() and check that we
 * *don't* find any instances of the secret data.
 */
-   memset(altstack, 0, sizeof(altstack));
+   memset(altstack, 0, ALTSTACK_SIZE);
call_on_stack(do_test_with_bzero);
 
return (0);