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


Index: disklabel.c
===================================================================
RCS file: /cvs/src/sbin/disklabel/disklabel.c,v
retrieving revision 1.214
diff -u -p -r1.214 disklabel.c
--- disklabel.c 25 Nov 2015 17:17:38 -0000      1.214
+++ disklabel.c 27 May 2016 15:13:25 -0000
@@ -119,6 +119,7 @@ main(int argc, char *argv[])
        int ch, f, error = 0;
        FILE *t;
        char *autotable = NULL;
+       struct stat sb;
 
        getphysmem();
 
@@ -211,6 +212,9 @@ main(int argc, char *argv[])
            &specname);
        if (f < 0)
                err(4, "%s", specname);
+       fstat(f, &sb);
+       if (!S_ISBLK(sb.st_mode) && !S_ISCHR(sb.st_mode))
+               errx(1, "%s is not a device", dkname);
 
        if (autotable != NULL)
                parse_autotable(autotable);

Reply via email to