A slightly different beast:

$ touch abcdabcdabcdabcd.a
$ ktrace growfs abcdabcdabcdabcd.a
Abort trap (core dumped)
$ kdump | tail
 63324 growfs   CALL  mprotect(0xe2b84265000,0x1000,0x1<PROT_READ>)
 63324 growfs   RET   mprotect 0
 63324 growfs   CALL  
mmap(0,0x1000,0x3<PROT_READ|PROT_WRITE>,0x1002<MAP_PRIVATE|MAP_ANON>,-1,0)
 63324 growfs   RET   mmap 15591131877376/0xe2e17e09000
 63324 growfs   CALL  
mmap(0,0x1000,0x3<PROT_READ|PROT_WRITE>,0x1002<MAP_PRIVATE|MAP_ANON>,-1,0)
 63324 growfs   RET   mmap 15592351502336/0xe2e60929000
 63324 growfs   CALL  ioctl(3,DIOCGDINFO,0xe2e17e09a00)
 63324 growfs   PLDG  ioctl, "ioctl", errno 1 Operation not permitted
 63324 growfs   PSIG  SIGABRT SIG_DFL
 63324 growfs   NAMI  "growfs.core"

Moving the pledge call a bit down will allow growfs to error out with
ENOTTY instead of crashing. As there are other "disklabel" operations,
further down (e.g. in return_disklabel()), keep the "disklabel" pledge.

Index: growfs.c
===================================================================
RCS file: /var/cvs/src/sbin/growfs/growfs.c,v
retrieving revision 1.50
diff -u -p -r1.50 growfs.c
--- growfs.c    17 Mar 2016 05:27:10 -0000      1.50
+++ growfs.c    28 May 2016 20:02:36 -0000
@@ -1767,9 +1767,6 @@ main(int argc, char **argv)
                        err(1, "%s", device);
        }
 
-       if (pledge("stdio disklabel", NULL) == -1)
-               err(1, "pledge");
-
        /*
         * Now we have a file descriptor for our device, fstat() it to
         * figure out the partition number.
@@ -1788,6 +1785,9 @@ main(int argc, char **argv)
        else
                errx(1, "%s: invalid partition number %u",
                    device, DISKPART(st.st_rdev));
+
+       if (pledge("stdio disklabel", NULL) == -1)
+               err(1, "pledge");
 
        /*
         * Check if that partition is suitable for growing a file system.

Reply via email to