I don't think we should bring ! back.

I wanted to remove v and | (and some other stuff) shortly afterwards, but
several people objected.

I did suggest having a lightweight less in base for most people and adding
the full upstream less to ports for the stuff we don't want to maintain
(like we do for eg libevent) but other people didn't like that idea.



On 17 December 2017 at 15:48, kshe <ksh...@zoho.eu> wrote:

> On Sat, 16 Dec 2017 21:52:44 +0000, Theo de Raadt wrote:
> > > On Sat, 16 Dec 2017 19:39:27 +0000, Theo de Raadt wrote:
> > > > > On Sat, 16 Dec 2017 18:13:16 +0000, Jiri B wrote:
> > > > > > On Sat, Dec 16, 2017 at 04:55:44PM +0000, kshe wrote:
> > > > > > > Hi,
> > > > > > >
> > > > > > > Would a patch to bring back the `!' command to less(1) be
> accepted?  The
> > > > > > > commit message for its removal explains that ^Z should be used
> instead,
> > > > > > > but that obviously does not work if less(1) is run from
> something else
> > > > > > > than an interactive shell, for example when reading manual
> pages from a
> > > > > > > vi(1) instance spawned directly by `xterm -e vi' in a window
> manager or
> > > > > > > by `neww vi' in a tmux(1) session.
> > > > > >
> > > > > > Why should less be able to spawn another programs? This would
> undermine
> > > > > > all pledge work.
> > > > >
> > > > > Because of at least `v' and `|', less(1) already is able to invoke
> > > > > arbitrary programs, and accordingly needs the "proc exec" promise,
> so
> > > > > bringing `!' back would not change anything from a security
> perspective
> > > > > (otherwise, I would obviously not have made such a proposition).
> > > > >
> > > > > In fact, technically, what I want to do is still currently
> possible:
> > > > > from any less(1) instance, one may use `v' to invoke vi(1), and
> then use
> > > > > vi(1)'s own `!' command as desired.  So the functionality of `!' is
> > > > > still there; it was only made more difficult to reach for no
> apparent
> > > > > reason.
> > > >
> > > > No apparent reason?
> > > >
> > > > Good you have an opinion.  I have a different opinion: We should look
> > > > for rarely used functionality and gut it.
> > >
> > > I completely agree, and I also completely agree with the rest of what
> > > you said.  However, in this particular case, the functionality of `!'
> is
> > > still fully (albeit indirectly) accessible, as shown above, and this is
> > > why its deletion, when not immediately followed by that of `|' and `v',
> > > made little sense for me.
> >
> > Oh, so you don't agree.  Or do you.  I can't tell.  You haven't made up
> > your mind enough to have a final position?
>
> In the case of less(1), the underlying functionality of `!' (invoking
> arbitrary programs) has not been removed at all, as `!' itself was only
> one way amongst others of doing that.  Therefore, I would have prefered
> that such an endeavour be conducted in steps at least as large as a
> pledge(2) category.  You may say this is absolutist, but, in the end,
> users might actually be more inclined to accept such removals if they
> come with, and thus are justified by, a real and immediate security
> benefit, like stricter pledge(2) promises, rather than some vague
> theoretical explanation about the global state of their software
> environment.
>
> > [...]
> >
> > > May I go ahead and prepare a patch to remove "proc exec" entirely?
> >
> > Sure you could try, and see who freaks out.  Exactly what the plan was
> > all along.
>
> The minimal diff below does that.  If it is accepted, further cleanups
> would need to follow (in particular, removing a few unused variables and
> functions), and of course the manual would also need some adjustments.
>
> Index: cmd.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/less/cmd.h,v
> retrieving revision 1.10
> diff -u -p -r1.10 cmd.h
> --- cmd.h       6 Nov 2015 15:58:01 -0000       1.10
> +++ cmd.h       17 Dec 2017 12:23:00 -0000
> @@ -42,12 +42,12 @@
>  #define        A_FF_LINE               29
>  #define        A_BF_LINE               30
>  #define        A_VERSION               31
> -#define        A_VISUAL                32
> +/* 32 unused */
>  #define        A_F_WINDOW              33
>  #define        A_B_WINDOW              34
>  #define        A_F_BRACKET             35
>  #define        A_B_BRACKET             36
> -#define        A_PIPE                  37
> +/* 37 unused */
>  #define        A_INDEX_FILE            38
>  #define        A_UNDO_SEARCH           39
>  #define        A_FF_SCREEN             40
> Index: command.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/less/command.c,v
> retrieving revision 1.31
> diff -u -p -r1.31 command.c
> --- command.c   12 Jan 2017 20:32:01 -0000      1.31
> +++ command.c   17 Dec 2017 12:23:00 -0000
> @@ -241,12 +241,6 @@ exec_mca(void)
>                 /* If tag structure is loaded then clean it up. */
>                 cleantags();
>                 break;
> -       case A_PIPE:
> -               if (secure)
> -                       break;
> -               (void) pipe_mark(pipec, cbuf);
> -               error("|done", NULL);
> -               break;
>         }
>  }
>
> @@ -1396,35 +1390,6 @@ again:
>                         c = getcc();
>                         goto again;
>
> -               case A_VISUAL:
> -                       /*
> -                        * Invoke an editor on the input file.
> -                        */
> -                       if (secure) {
> -                               error("Command not available", NULL);
> -                               break;
> -                       }
> -                       if (ch_getflags() & CH_HELPFILE)
> -                               break;
> -                       if (strcmp(get_filename(curr_ifile), "-") == 0) {
> -                               error("Cannot edit standard input", NULL);
> -                               break;
> -                       }
> -                       if (curr_altfilename != NULL) {
> -                               error("WARNING: This file was viewed via "
> -                                   "LESSOPEN", NULL);
> -                       }
> -                       /*
> -                        * Expand the editor prototype string
> -                        * and pass it to the system to execute.
> -                        * (Make sure the screen is displayed so the
> -                        * expansion of "+%lm" works.)
> -                        */
> -                       make_display();
> -                       cmd_exec();
> -                       lsystem(pr_expand(editproto, 0), NULL);
> -                       break;
> -
>                 case A_NEXT_FILE:
>                         /*
>                          * Examine next file.
> @@ -1568,25 +1533,6 @@ again:
>                         cmd_exec();
>                         gomark(c);
>                         break;
> -
> -               case A_PIPE:
> -                       if (secure) {
> -                               error("Command not available", NULL);
> -                               break;
> -                       }
> -                       start_mca(A_PIPE, "|mark: ", (void*)NULL, 0);
> -                       c = getcc();
> -                       if (c == erase_char || c == erase2_char ||
> -                           c == kill_char)
> -                               break;
> -                       if (c == '\n' || c == '\r')
> -                               c = '.';
> -                       if (badmark(c))
> -                               break;
> -                       pipec = c;
> -                       start_mca(A_PIPE, "!", ml_shell, 0);
> -                       c = getcc();
> -                       goto again;
>
>                 case A_B_BRACKET:
>                 case A_F_BRACKET:
> Index: decode.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/less/decode.c,v
> retrieving revision 1.18
> diff -u -p -r1.18 decode.c
> --- decode.c    17 Sep 2016 15:06:41 -0000      1.18
> +++ decode.c    17 Dec 2017 12:23:00 -0000
> @@ -148,8 +148,6 @@ static unsigned char cmdtable[] =
>         ':', 'x', 0,                    A_INDEX_FILE,
>         ':', 'd', 0,                    A_REMOVE_FILE,
>         ':', 't', 0,                    A_OPT_TOGGLE|A_EXTRA,   't', 0,
> -       '|', 0,                         A_PIPE,
> -       'v', 0,                         A_VISUAL,
>         '+', 0,                         A_FIRSTCMD,
>
>         'H', 0,                         A_HELP,
> Index: lesskey.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/less/lesskey.c,v
> retrieving revision 1.17
> diff -u -p -r1.17 lesskey.c
> --- lesskey.c   17 Sep 2016 15:06:41 -0000      1.17
> +++ lesskey.c   17 Dec 2017 12:23:00 -0000
> @@ -134,7 +134,6 @@ struct cmdname cmdnames[] = {
>         { "next-tag",                   A_NEXT_TAG },
>         { "noaction",                   A_NOACTION },
>         { "percent",                    A_PERCENT },
> -       { "pipe",                       A_PIPE },
>         { "prev-file",                  A_PREV_FILE },
>         { "prev-tag",                   A_PREV_TAG },
>         { "quit",                       A_QUIT },
> @@ -152,7 +151,6 @@ struct cmdname cmdnames[] = {
>         { "toggle-option",              A_OPT_TOGGLE },
>         { "undo-hilite",                A_UNDO_SEARCH },
>         { "version",                    A_VERSION },
> -       { "visual",                     A_VISUAL },
>         { NULL,                         0 }
>  };
>
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/less/main.c,v
> retrieving revision 1.35
> diff -u -p -r1.35 main.c
> --- main.c      17 Sep 2016 15:06:41 -0000      1.35
> +++ main.c      17 Dec 2017 12:23:00 -0000
> @@ -96,7 +96,7 @@ main(int argc, char *argv[])
>                         exit(1);
>                 }
>         } else {
> -               if (pledge("stdio rpath wpath cpath fattr proc exec tty",
> NULL) == -1) {
> +               if (pledge("stdio rpath wpath cpath fattr tty", NULL) ==
> -1) {
>                         perror("pledge");
>                         exit(1);
>                 }
>
> Regards,
>
> kshe
>
>

Reply via email to