Hi,

Sorry to be late in the game, but as jca@ pointed out sysctl(8) tries to
open _PATH_DEVDB first and then /dev if it cannot open the former, so
both should be unveil(2)ed. Scramble the includes while at it.

Index: sysctl.c
===================================================================
RCS file: /cvs/src/sbin/sysctl/sysctl.c,v
retrieving revision 1.242
diff -u -p -u -r1.242 sysctl.c
--- sysctl.c    13 May 2019 20:47:19 -0000      1.242
+++ sysctl.c    14 Jun 2019 19:04:01 -0000
@@ -94,13 +94,14 @@
 #include <ddb/db_var.h>
 #include <dev/rndvar.h>
 
+#include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <limits.h>
+#include <paths.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ctype.h>
-#include <limits.h>
 #include <unistd.h>
 
 #include <machine/cpu.h>
@@ -162,6 +163,8 @@ struct list secondlevel[] = {
 
 int    Aflag, aflag, nflag, qflag;
 
+time_t boottime;
+
 /*
  * Variables requiring special processing.
  */
@@ -255,6 +258,15 @@ main(int argc, char *argv[])
        argc -= optind;
        argv += optind;
 
+       ctime(&boottime); /* satisfy potential $TZ expansion before unveil() */
+
+       if (unveil(_PATH_DEVDB, "r") == -1)
+               err(1,"unveil");
+       if (unveil("/dev", "r") == -1)
+               err(1, "unveil");
+       if (unveil(NULL, NULL) == -1)
+               err(1, "unveil");
+
        if (argc == 0 || (Aflag || aflag)) {
                debuginit();
                vfsinit();
@@ -893,7 +905,6 @@ parse(char *string, int flags)
        }
        if (special & BOOTTIME) {
                struct timeval *btp = (struct timeval *)buf;
-               time_t boottime;
 
                if (!nflag) {
                        boottime = btp->tv_sec;

On 10:35 Sat 08 Jun     , Theo de Raadt wrote:
> When userland was massaged for pledge(), I hesitated using the
> "manually call tzset()" approach for handling things.  It felt
> too low-level to call tzset(), an API almost noone knows the
> existance of.
> 
> Arriving in the same situation to satisfy unveil().  Again calling
> tzset() feels too unfamiliar and low level.
> 
> Regarding the comment in your diff, it says "localtime", but what is
> actually called is ctime(), which calls localtime() (which calls
> tzset(), which is where the unveil-files-missing or pledge-whatver
> issues would show up in some programs).  Probably should adjust
> the comment
> 
> Here's the later troublesome chunk:
> 
>         if (special & BOOTTIME) {
>                 struct timeval *btp = (struct timeval *)buf;
>                 time_t boottime;
> 
>                 if (!nflag) {
>                         boottime = btp->tv_sec;
>                         (void)printf("%s%s%s", string, equ, ctime(&boottime));
> 
> That makes me wonder, can we be less obtuse up front, and
> prime the subsystem before unveil by calling the same function which
> will be called later?
> 
> Something like this.  It feels slightly better to me.
> 
> Index: sysctl.c
> ===================================================================
> RCS file: /cvs/src/sbin/sysctl/sysctl.c,v
> retrieving revision 1.242
> diff -u -p -u -r1.242 sysctl.c
> --- sysctl.c  13 May 2019 20:47:19 -0000      1.242
> +++ sysctl.c  8 Jun 2019 16:33:07 -0000
> @@ -162,6 +162,8 @@ struct list secondlevel[] = {
>  
>  int  Aflag, aflag, nflag, qflag;
>  
> +time_t boottime;
> +
>  /*
>   * Variables requiring special processing.
>   */
> @@ -255,6 +257,12 @@ main(int argc, char *argv[])
>       argc -= optind;
>       argv += optind;
>  
> +     ctime(&boottime); /* satisfy potential $TZ expansion before unveil() */
> +
> +     if (unveil("/dev", "r") == -1)
> +             err(1, "unveil");
> +     if (unveil(NULL, NULL) == -1)
> +             err(1, "unveil");
>       if (argc == 0 || (Aflag || aflag)) {
>               debuginit();
>               vfsinit();
> @@ -893,7 +901,6 @@ parse(char *string, int flags)
>       }
>       if (special & BOOTTIME) {
>               struct timeval *btp = (struct timeval *)buf;
> -             time_t boottime;
>  
>               if (!nflag) {
>                       boottime = btp->tv_sec;
> 
> 
> 
> 
> 
> Florian Obser <flor...@openbsd.org> wrote:
> 
> > On Fri, Jun 07, 2019 at 11:24:30PM +0100, Ricardo Mestre wrote:
> > > i did that and for some for reason i didn't get it! it tries to open
> > > timezone so it kinda looks like a red flag right there...
> > > 
> > > apart from /dev do we need to look into TZ on this one as well? if TZ
> > > var needs to be looked at then all bets are off :/
> > 
> > this seems to do the right thing:
> > 
> > diff --git sysctl.c sysctl.c
> > index dc6abc16670..c74e706942a 100644
> > --- sysctl.c
> > +++ sysctl.c
> > @@ -255,6 +255,13 @@ main(int argc, char *argv[])
> >     argc -= optind;
> >     argv += optind;
> >  
> > +   tzset(); /* for kern.boottime in localtime */
> > +
> > +   if (unveil("/dev", "r") == -1)
> > +           err(1, "unveil");
> > +   if (unveil(NULL, NULL) == -1)
> > +           err(1, "unveil");
> > +
> >     if (argc == 0 || (Aflag || aflag)) {
> >             debuginit();
> >             vfsinit();
> > 
> > 
> > -- 
> > I'm not entirely sure you are real.
> > 

On 10:35 Sat 08 Jun     , Theo de Raadt wrote:
> When userland was massaged for pledge(), I hesitated using the
> "manually call tzset()" approach for handling things.  It felt
> too low-level to call tzset(), an API almost noone knows the
> existance of.
> 
> Arriving in the same situation to satisfy unveil().  Again calling
> tzset() feels too unfamiliar and low level.
> 
> Regarding the comment in your diff, it says "localtime", but what is
> actually called is ctime(), which calls localtime() (which calls
> tzset(), which is where the unveil-files-missing or pledge-whatver
> issues would show up in some programs).  Probably should adjust
> the comment
> 
> Here's the later troublesome chunk:
> 
>         if (special & BOOTTIME) {
>                 struct timeval *btp = (struct timeval *)buf;
>                 time_t boottime;
> 
>                 if (!nflag) {
>                         boottime = btp->tv_sec;
>                         (void)printf("%s%s%s", string, equ, ctime(&boottime));
> 
> That makes me wonder, can we be less obtuse up front, and
> prime the subsystem before unveil by calling the same function which
> will be called later?
> 
> Something like this.  It feels slightly better to me.
> 
> Index: sysctl.c
> ===================================================================
> RCS file: /cvs/src/sbin/sysctl/sysctl.c,v
> retrieving revision 1.242
> diff -u -p -u -r1.242 sysctl.c
> --- sysctl.c  13 May 2019 20:47:19 -0000      1.242
> +++ sysctl.c  8 Jun 2019 16:33:07 -0000
> @@ -162,6 +162,8 @@ struct list secondlevel[] = {
>  
>  int  Aflag, aflag, nflag, qflag;
>  
> +time_t boottime;
> +
>  /*
>   * Variables requiring special processing.
>   */
> @@ -255,6 +257,12 @@ main(int argc, char *argv[])
>       argc -= optind;
>       argv += optind;
>  
> +     ctime(&boottime); /* satisfy potential $TZ expansion before unveil() */
> +
> +     if (unveil("/dev", "r") == -1)
> +             err(1, "unveil");
> +     if (unveil(NULL, NULL) == -1)
> +             err(1, "unveil");
>       if (argc == 0 || (Aflag || aflag)) {
>               debuginit();
>               vfsinit();
> @@ -893,7 +901,6 @@ parse(char *string, int flags)
>       }
>       if (special & BOOTTIME) {
>               struct timeval *btp = (struct timeval *)buf;
> -             time_t boottime;
>  
>               if (!nflag) {
>                       boottime = btp->tv_sec;
> 
> 
> 
> 
> 
> Florian Obser <flor...@openbsd.org> wrote:
> 
> > On Fri, Jun 07, 2019 at 11:24:30PM +0100, Ricardo Mestre wrote:
> > > i did that and for some for reason i didn't get it! it tries to open
> > > timezone so it kinda looks like a red flag right there...
> > > 
> > > apart from /dev do we need to look into TZ on this one as well? if TZ
> > > var needs to be looked at then all bets are off :/
> > 
> > this seems to do the right thing:
> > 
> > diff --git sysctl.c sysctl.c
> > index dc6abc16670..c74e706942a 100644
> > --- sysctl.c
> > +++ sysctl.c
> > @@ -255,6 +255,13 @@ main(int argc, char *argv[])
> >     argc -= optind;
> >     argv += optind;
> >  
> > +   tzset(); /* for kern.boottime in localtime */
> > +
> > +   if (unveil("/dev", "r") == -1)
> > +           err(1, "unveil");
> > +   if (unveil(NULL, NULL) == -1)
> > +           err(1, "unveil");
> > +
> >     if (argc == 0 || (Aflag || aflag)) {
> >             debuginit();
> >             vfsinit();
> > 
> > 
> > -- 
> > I'm not entirely sure you are real.
> > 

Reply via email to