On Sat, May 28, 2016 at 09:27:09AM -0600, Theo de Raadt wrote:
> > If you try to run disklabel(8) on a file that is not a device, it aborts
> > aborts for want of pledge("ioctl"). This diff prints an error message
> > and exits cleanly. I return exit code 1 but note that sometimes
> > disklabel returns 4; the man page doesn't explain the distinction
> > anywhere.
> > 
> >   $ disklabel /
> >   Abort trap (core dumped)
> >   $ obj/disklabel /
> >   disklabel: / is not a device
> 
> Surprisingly, your fix won't help.  The problem is that opendev() is
> after pledge.
> 
> That is incorrect.  The pledge should occur after opendev.

Try this instead
Index: disklabel.c
===================================================================
RCS file: /cvs/src/sbin/disklabel/disklabel.c,v
retrieving revision 1.214
diff -u -p -u -p -r1.214 disklabel.c
--- disklabel.c 25 Nov 2015 17:17:38 -0000      1.214
+++ disklabel.c 28 May 2016 15:32:11 -0000
@@ -191,6 +191,12 @@ main(int argc, char *argv[])
        argc -= optind;
        argv += optind;
 
+       dkname = argv[0];
+       f = opendev(dkname, (op == READ ? O_RDONLY : O_RDWR), OPENDEV_PART,
+           &specname);
+       if (f < 0)
+               err(4, "%s", specname);
+
        if (op == EDIT || op == EDITOR || aflag) {
                if (pledge("stdio rpath wpath cpath disklabel proc exec", NULL) 
== -1)
                        err(1, "pledge");
@@ -205,12 +211,6 @@ main(int argc, char *argv[])
        if (argc < 1 || (fstabfile && !(op == EDITOR || op == RESTORE ||
                    aflag)))
                usage();
-
-       dkname = argv[0];
-       f = opendev(dkname, (op == READ ? O_RDONLY : O_RDWR), OPENDEV_PART,
-           &specname);
-       if (f < 0)
-               err(4, "%s", specname);
 
        if (autotable != NULL)
                parse_autotable(autotable);

Reply via email to