Add an explicit zero-length check for UTF-8 input data, prompted by a report

from parfait via deraadt.

While here, add a statement to set the width when filling with _s if not enough
space (width should never be high enough at the moment anyway), and wrap some
long lines.
This commit is contained in:
Nicholas Marriott 2009-11-11 18:53:21 +00:00
parent 08a8ccf46b
commit 9df4e7597d

View File

@ -1039,6 +1039,8 @@ screen_write_cell(struct screen_write_ctx *ctx,
/* Construct UTF-8 and write it. */ /* Construct UTF-8 and write it. */
gu.width = utf8data->width; gu.width = utf8data->width;
memset(gu.data, 0xff, sizeof gu.data); memset(gu.data, 0xff, sizeof gu.data);
if (utf8data->size == 0)
fatalx("UTF-8 data empty");
if (utf8data->size > sizeof gu.data) if (utf8data->size > sizeof gu.data)
fatalx("UTF-8 data overflow"); fatalx("UTF-8 data overflow");
memcpy(gu.data, utf8data->data, utf8data->size); memcpy(gu.data, utf8data->data, utf8data->size);
@ -1084,6 +1086,10 @@ screen_write_combine(
if (s->cx == 0) if (s->cx == 0)
return (-1); return (-1);
/* Empty utf8data is out. */
if (utf8data->size == 0)
fatalx("UTF-8 data empty");
/* Retrieve the previous cell and convert to UTF-8 if not already. */ /* Retrieve the previous cell and convert to UTF-8 if not already. */
gc = grid_view_get_cell(gd, s->cx - 1, s->cy); gc = grid_view_get_cell(gd, s->cx - 1, s->cy);
if (!(gc->flags & GRID_FLAG_UTF8)) { if (!(gc->flags & GRID_FLAG_UTF8)) {
@ -1108,6 +1114,7 @@ screen_write_combine(
gu->data[i] = '_'; gu->data[i] = '_';
if (i != UTF8_SIZE) if (i != UTF8_SIZE)
gu->data[i] = 0xff; gu->data[i] = 0xff;
gu->width = i;
return (0); return (0);
} }
@ -1166,14 +1173,16 @@ screen_write_overwrite(struct screen_write_ctx *ctx)
gu = grid_view_peek_utf8(gd, s->cx, s->cy); gu = grid_view_peek_utf8(gd, s->cx, s->cy);
if (gu->width > 1) { if (gu->width > 1) {
/* /*
* An UTF-8 wide cell; overwrite following padding cells only. * An UTF-8 wide cell; overwrite following padding
* cells only.
*/ */
xx = s->cx; xx = s->cx;
while (++xx < screen_size_x(s)) { while (++xx < screen_size_x(s)) {
gc = grid_view_peek_cell(gd, xx, s->cy); gc = grid_view_peek_cell(gd, xx, s->cy);
if (!(gc->flags & GRID_FLAG_PADDING)) if (!(gc->flags & GRID_FLAG_PADDING))
break; break;
grid_view_set_cell(gd, xx, s->cy, &grid_default_cell); grid_view_set_cell(
gd, xx, s->cy, &grid_default_cell);
} }
} }
} }