ping

On Sat, Jan 28, 2017 at 03:25:53PM +0100, Theo Buehler wrote:
> The problem:
> 
> $ mount /dev/tty /tmp
> Abort trap (core dumped)
> 
> The relevant kdump snippet:
> 
>  45441 mount    CALL  open(0x7f7ffffeb580,0x10000<O_RDONLY|O_CLOEXEC>)
>  45441 mount    NAMI  "/dev/tty"
>  45441 mount    RET   open 3
>  45441 mount    CALL  ioctl(3,DIOCGDINFO,0x7f7ffffeb350)
>  45441 mount    PLDG  ioctl, "tty", errno 1 Operation not permitted
>  45441 mount    PSIG  SIGABRT SIG_DFL
> 
> and the backtrace:
> 
> #0  0x00001103967a72aa in ioctl () at <stdin>:2
> #1  0x0000110364ca97b9 in readlabelfs (device=0x7f7ffffd0ada "/dev/tty", 
> verbose=0) at /usr/src/lib/libutil/readlabel.c:128
> #2  0x00001100d4201210 in main () from /usr/obj/sbin/mount/mount
> 
> As usual, the fix consists of hoisting the problematic bit above the
> pledge call.  This has the side effect that the string bashing functions
> hasopt(), catopt() and maketypelist() are now called without pledge from
> the getopt switch, but I don't think that's a problem.  It would be easy
> to postpone the call to maketypelist() until after pledge, if anyone is
> worried about it.
> 
> Index: mount.c
> ===================================================================
> RCS file: /var/cvs/src/sbin/mount/mount.c,v
> retrieving revision 1.70
> diff -u -p -r1.70 mount.c
> --- mount.c   25 Jan 2017 02:33:25 -0000      1.70
> +++ mount.c   28 Jan 2017 14:11:28 -0000
> @@ -109,9 +109,6 @@ main(int argc, char * const argv[])
>       int all, ch, forceall, i, mntsize, rval, new;
>       char *options, mntpath[PATH_MAX];
>  
> -     if (pledge("stdio rpath disklabel proc exec", NULL) == -1)
> -             err(1, "pledge");
> -
>       all = forceall = 0;
>       options = NULL;
>       vfstype = "ffs";
> @@ -168,6 +165,25 @@ main(int argc, char * const argv[])
>       argc -= optind;
>       argv += optind;
>  
> +     if (typelist == NULL && argc == 2) {
> +             /*
> +              * If -t flag has not been specified, and spec contains either
> +              * a ':' or a '@' then assume that an NFS filesystem is being
> +              * specified ala Sun.  If not, check the disklabel for a
> +              * known filesystem type.
> +              */
> +             if (strpbrk(argv[0], ":@") != NULL)
> +                     vfstype = "nfs";
> +             else {
> +                     char *labelfs = readlabelfs(argv[0], 0);
> +                     if (labelfs != NULL)
> +                             vfstype = labelfs;
> +             }
> +     }
> +
> +     if (pledge("stdio rpath disklabel proc exec", NULL) == -1)
> +             err(1, "pledge");
> +
>  #define      BADTYPE(type)                                                   
> \
>       (strcmp(type, FSTAB_RO) &&                                      \
>           strcmp(type, FSTAB_RW) && strcmp(type, FSTAB_RQ))
> @@ -261,23 +277,7 @@ main(int argc, char * const argv[])
>                   mntonname, options, fs->fs_mntops, skip);
>               break;
>       case 2:
> -             /*
> -              * If -t flag has not been specified, and spec contains either
> -              * a ':' or a '@' then assume that an NFS filesystem is being
> -              * specified ala Sun.  If not, check the disklabel for a
> -              * known filesystem type.
> -              */
> -             if (typelist == NULL) {
> -                     if (strpbrk(argv[0], ":@") != NULL)
> -                             vfstype = "nfs";
> -                     else {
> -                             char *labelfs = readlabelfs(argv[0], 0);
> -                             if (labelfs != NULL)
> -                                     vfstype = labelfs;
> -                     }
> -             }
> -             rval = mountfs(vfstype,
> -                 argv[0], argv[1], options, NULL, 0);
> +             rval = mountfs(vfstype, argv[0], argv[1], options, NULL, 0);
>               break;
>       default:
>               usage();
> 

Reply via email to