Theo Buehler([email protected]) on 2017.02.06 08:17:43 +0100:
> 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.
i think that tradeoff is fine here.
ok benno@
> >
> > 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();
> >
>