Merge upstream bug fixes
authortobias <tobias@openbsd.org>
Sat, 9 Oct 2021 15:27:18 +0000 (15:27 +0000)
committertobias <tobias@openbsd.org>
Sat, 9 Oct 2021 15:27:18 +0000 (15:27 +0000)
- Switch http to https for upstream URL
- Fix buffer sizes and lesskey parser functions
- Fix integer overflow in bracket match function
- Fix prompt hiding feature (CTRL + P)

ok deraadt, millert

usr.bin/less/brac.c
usr.bin/less/command.c
usr.bin/less/decode.c
usr.bin/less/optfunc.c
usr.bin/less/option.c

index b27ea61..0540e41 100644 (file)
@@ -75,6 +75,8 @@ match_brac(int obrac, int cbrac, int forwdir, int n)
        nest = 0;
        while ((c = (*chget)()) != EOI) {
                if (c == obrac) {
+                       if (nest == INT_MAX)
+                               break;
                        nest++;
                } else if (c == cbrac && --nest < 0) {
                        /*
index 4a90d74..4fc19d9 100644 (file)
@@ -264,6 +264,7 @@ is_erase_char(int c)
 static int
 mca_opt_first_char(int c)
 {
+       int no_prompt = (optflag & OPT_NO_PROMPT);
        int flag = (optflag & ~OPT_NO_PROMPT);
        if (flag == OPT_NO_TOGGLE) {
                switch (c) {
@@ -277,12 +278,14 @@ mca_opt_first_char(int c)
                switch (c) {
                case '+':
                        /* "-+" = UNSET. */
-                       optflag = (flag == OPT_UNSET) ? OPT_TOGGLE : OPT_UNSET;
+                       optflag = no_prompt |
+                           ((flag == OPT_UNSET) ? OPT_TOGGLE : OPT_UNSET);
                        mca_opt_toggle();
                        return (MCA_MORE);
                case '!':
                        /* "-!" = SET */
-                       optflag = (flag == OPT_SET) ? OPT_TOGGLE : OPT_SET;
+                       optflag = no_prompt |
+                           ((flag == OPT_SET) ? OPT_TOGGLE : OPT_SET);
                        mca_opt_toggle();
                        return (MCA_MORE);
                case CONTROL('P'):
index 67496d8..4846e0c 100644 (file)
@@ -563,6 +563,7 @@ static int
 new_lesskey(char *buf, int len, int sysvar)
 {
        char *p;
+       char *end;
        int c;
        int n;
 
@@ -575,21 +576,28 @@ new_lesskey(char *buf, int len, int sysvar)
            buf[len-1] != C2_END_LESSKEY_MAGIC)
                return (-1);
        p = buf + 4;
+       end = buf + len;
        for (;;) {
                c = *p++;
                switch (c) {
                case CMD_SECTION:
                        n = gint(&p);
+                       if (n < 0 || p + n >= end)
+                               return (-1);
                        add_fcmd_table(p, n);
                        p += n;
                        break;
                case EDIT_SECTION:
                        n = gint(&p);
+                       if (n < 0 || p + n >= end)
+                               return (-1);
                        add_ecmd_table(p, n);
                        p += n;
                        break;
                case VAR_SECTION:
                        n = gint(&p);
+                       if (n < 0 || p + n >= end)
+                               return (-1);
                        add_var_table((sysvar) ?
                            &list_sysvar_tables : &list_var_tables, p, n);
                        p += n;
@@ -663,7 +671,8 @@ lesskey(char *filename, int sysvar)
         * Figure out if this is an old-style (before version 241)
         * or new-style lesskey file format.
         */
-       if (buf[0] != C0_LESSKEY_MAGIC || buf[1] != C1_LESSKEY_MAGIC ||
+       if (len < 4 ||
+           buf[0] != C0_LESSKEY_MAGIC || buf[1] != C1_LESSKEY_MAGIC ||
            buf[2] != C2_LESSKEY_MAGIC || buf[3] != C3_LESSKEY_MAGIC)
                return (old_lesskey(buf, (int)len));
        return (new_lesskey(buf, (int)len, sysvar));
index 2c0b81f..c9e6490 100644 (file)
@@ -420,7 +420,7 @@ opt__V(int type, char *s)
                putstr("to the extent permitted by law.\n");
                putstr("For information about the terms of redistribution,\n");
                putstr("see the file named README in the less distribution.\n");
-               putstr("Homepage: http://www.greenwoodsoftware.com/less\n");
+               putstr("Homepage: https://www.greenwoodsoftware.com/less\n");
                putstr("\n");
                quit(QUIT_OK);
                break;
@@ -436,7 +436,7 @@ opt_x(int type, char *s)
        extern int tabstops[];
        extern int ntabstops;
        extern int tabdefault;
-       char tabs[60+(4*TABSTOP_MAX)];
+       char tabs[60 + 11 * TABSTOP_MAX];
        int i;
        PARG p;
 
index 7bdda88..fbfefe4 100644 (file)
@@ -55,7 +55,7 @@ opt_desc(struct loption *o)
 char *
 propt(int c)
 {
-       static char buf[8];
+       static char buf[33];
 
        (void) snprintf(buf, sizeof (buf), "-%s", prchar(c));
        return (buf);