And then rebuild and install a new kernel:
KK=`sysctl -n kern.osversion | cut -d# -f1`
cd /usr/src/sys/arch/`machine`/compile/$KK
make obj
make config
make
make install
Index: sys/dev/wscons/wsemul_vt100.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsemul_vt100.c,v
diff -u -p -u -r1.39 wsemul_vt100.c
--- sys/dev/wscons/wsemul_vt100.c 25 May 2020 09:55:49 -0000 1.39
+++ sys/dev/wscons/wsemul_vt100.c 23 Feb 2023 17:54:34 -0000
@@ -189,7 +189,7 @@ wsemul_vt100_cnattach(const struct wsscr
edp->tabs = NULL;
edp->dblwid = NULL;
edp->dw = 0;
- edp->dcsarg = 0;
+ edp->dcsarg = NULL;
edp->isolatin1tab = edp->decgraphtab = edp->dectechtab = NULL;
edp->nrctab = NULL;
wsemul_vt100_reset(edp);
@@ -574,12 +574,15 @@ wsemul_vt100_output_esc(struct wsemul_vt
edp->sschartab = 3;
break;
case 'M': /* RI */
- if (ROWS_ABOVE > 0) {
- edp->crow--;
+ i = ROWS_ABOVE;
+ if (i > 0) {
+ if (edp->crow > 0)
+ edp->crow--;
CHECK_DW;
- break;
+ } else if (i == 0) {
+ /* Top of scroll region. */
+ rc = wsemul_vt100_scrolldown(edp, 1);
}
- rc = wsemul_vt100_scrolldown(edp, 1);
break;
case 'P': /* DCS */
edp->nargs = 0;
@@ -807,7 +810,7 @@ int
wsemul_vt100_output_string(struct wsemul_vt100_emuldata *edp,
struct wsemul_inputstate *instate)
{
- if (edp->dcstype && edp->dcspos < DCS_MAXLEN) {
+ if (edp->dcsarg && edp->dcstype && edp->dcspos < DCS_MAXLEN) {
if (instate->inchar & ~0xff) {
#ifdef VT100_PRINTUNKNOWN
printf("unknown char %x in DCS\n", instate->inchar);
Index: sys/dev/wscons/wsemul_vt100_subr.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsemul_vt100_subr.c,v
diff -u -p -u -r1.24 wsemul_vt100_subr.c
--- sys/dev/wscons/wsemul_vt100_subr.c 25 May 2020 09:55:49 -0000 1.24
+++ sys/dev/wscons/wsemul_vt100_subr.c 23 Feb 2023 17:54:34 -0000
@@ -447,11 +447,15 @@ wsemul_vt100_handle_csi(struct wsemul_vt
ERASECOLS(edp->ccol, n, edp->bkgdattr));
break;
case 'A': /* CUU */
- edp->crow -= min(DEF1_ARG(0), ROWS_ABOVE);
+ n = ROWS_ABOVE;
+ if (n > 0)
+ edp->crow -= min(DEF1_ARG(0), n);
CHECK_DW;
break;
case 'B': /* CUD */
- edp->crow += min(DEF1_ARG(0), ROWS_BELOW);
+ n = ROWS_BELOW;
+ if (n > 0)
+ edp->crow += min(DEF1_ARG(0), n);
CHECK_DW;
break;
case 'C': /* CUF */
@@ -474,21 +478,22 @@ wsemul_vt100_handle_csi(struct wsemul_vt
break;
case 'L': /* IL insert line */
case 'M': /* DL delete line */
- {
- int savscrstartrow, savscrnrows;
+ if (edp->crow >= edp->scrreg_startrow &&
+ edp->crow < edp->scrreg_startrow + edp->scrreg_nrows) {
+ int savscrstartrow, savscrnrows;
- n = min(DEF1_ARG(0), ROWS_BELOW + 1);
- savscrstartrow = edp->scrreg_startrow;
- savscrnrows = edp->scrreg_nrows;
- edp->scrreg_nrows -= ROWS_ABOVE;
- edp->scrreg_startrow = edp->crow;
- if (c == 'L')
- rc = wsemul_vt100_scrolldown(edp, n);
- else
- rc = wsemul_vt100_scrollup(edp, n);
- edp->scrreg_startrow = savscrstartrow;
- edp->scrreg_nrows = savscrnrows;
- }
+ n = min(DEF1_ARG(0), ROWS_BELOW + 1);
+ savscrstartrow = edp->scrreg_startrow;
+ savscrnrows = edp->scrreg_nrows;
+ edp->scrreg_nrows -= ROWS_ABOVE;
+ edp->scrreg_startrow = edp->crow;
+ if (c == 'L')
+ rc = wsemul_vt100_scrolldown(edp, n);
+ else
+ rc = wsemul_vt100_scrollup(edp, n);
+ edp->scrreg_startrow = savscrstartrow;
+ edp->scrreg_nrows = savscrnrows;
+ } /* else not within scrolling region, ignore the sequence */
break;
case 'P': /* DCH delete character */
n = min(DEF1_ARG(0), COLS_LEFT + 1);
@@ -625,9 +630,11 @@ wsemul_vt100_handle_csi(struct wsemul_vt
{
char buf[20];
int row;
- if (edp->flags & VTFL_DECOM)
+ if (edp->flags & VTFL_DECOM) {
row = ROWS_ABOVE;
- else
+ if (row < 0)
+ row = 0;
+ } else
row = edp->crow;
n = snprintf(buf, sizeof buf, "\033[%d;%dR",
row + 1, edp->ccol + 1);
@@ -788,13 +795,17 @@ wsemul_vt100_handle_dcs(struct wsemul_vt
if (edp->tabs != NULL) {
memset(edp->tabs, 0, edp->ncols);
pos = 0;
+ if (edp->dcsarg == NULL)
+ goto out;
for (i = 0; i < edp->dcspos; i++) {
char c = edp->dcsarg[i];
switch (c) {
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
- pos = pos * 10 + (edp->dcsarg[i] - '0');
+ pos = pos * 10 + (c - '0');
+ if (pos > edp->ncols)
+ goto out;
break;
case '/':
if (pos > 0)
@@ -818,6 +829,7 @@ wsemul_vt100_handle_dcs(struct wsemul_vt
#endif
break;
}
+out:
edp->dcstype = 0;
}