From 2ec5aca064f297e97c2d0bd9d8a481d157f83ebe Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Fri, 13 Nov 2009 16:54:04 +0000 Subject: [PATCH] Sync OpenBSD patchset 529: 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. --- screen-write.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/screen-write.c b/screen-write.c index 0467ca04..0e39b03e 100644 --- a/screen-write.c +++ b/screen-write.c @@ -1,4 +1,4 @@ -/* $Id: screen-write.c,v 1.83 2009-10-23 17:16:24 tcunha Exp $ */ +/* $Id: screen-write.c,v 1.84 2009-11-13 16:54:04 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1039,6 +1039,8 @@ screen_write_cell(struct screen_write_ctx *ctx, /* Construct UTF-8 and write it. */ gu.width = utf8data->width; memset(gu.data, 0xff, sizeof gu.data); + if (utf8data->size == 0) + fatalx("UTF-8 data empty"); if (utf8data->size > sizeof gu.data) fatalx("UTF-8 data overflow"); memcpy(gu.data, utf8data->data, utf8data->size); @@ -1084,6 +1086,10 @@ screen_write_combine( if (s->cx == 0) 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. */ gc = grid_view_get_cell(gd, s->cx - 1, s->cy); if (!(gc->flags & GRID_FLAG_UTF8)) { @@ -1108,6 +1114,7 @@ screen_write_combine( gu->data[i] = '_'; if (i != UTF8_SIZE) gu->data[i] = 0xff; + gu->width = i; return (0); } @@ -1166,14 +1173,16 @@ screen_write_overwrite(struct screen_write_ctx *ctx) gu = grid_view_peek_utf8(gd, s->cx, s->cy); 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; while (++xx < screen_size_x(s)) { gc = grid_view_peek_cell(gd, xx, s->cy); if (!(gc->flags & GRID_FLAG_PADDING)) break; - grid_view_set_cell(gd, xx, s->cy, &grid_default_cell); + grid_view_set_cell( + gd, xx, s->cy, &grid_default_cell); } } }