https://github.com/cacalabs/libcaca/commit/e4968ba6e93e9fd35429eb16895c785c51072015.patch Patch adjusted to remove the lines modifying caca/t/canvas.cpp. This file does not exist in the current release. From e4968ba6e93e9fd35429eb16895c785c51072015 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Fri, 26 Feb 2021 12:40:06 +0100 Subject: [PATCH] Fix a problem in the caca_resize() overflow detection and add several unit tests. --- caca/canvas.c | 16 ++++++++-------- caca/t/canvas.cpp | 18 +++++++++++++++--- tools/makefont.c | 22 +++++++++++++++++++--- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/caca/canvas.c b/caca/canvas.c index d0715392..08c628c9 100644 --- a/caca/canvas.c +++ b/caca/canvas.c @@ -367,6 +367,14 @@ int caca_resize(caca_canvas_t *cv, int width, int height) { int x, y, f, old_width, old_height, old_size; + /* Check for overflow */ + int new_size = width * height; + if (new_size < 0 || (width > 0 && new_size / width != height)) + { + seterrno(EOVERFLOW); + return -1; + } + old_width = cv->width; old_height = cv->height; old_size = old_width * old_height; @@ -377,14 +385,6 @@ int caca_resize(caca_canvas_t *cv, int width, int height) * dirty rectangle handling */ cv->width = width; cv->height = height; - int new_size = width * height; - - /* Check for overflow */ - if (new_size / width != height) - { - seterrno(EOVERFLOW); - return -1; - } /* If width or height is smaller (or both), we have the opportunity to * reduce or even remove dirty rectangles */ diff --git a/tools/makefont.c b/tools/makefont.c index 226c8838..66718605 100644 --- a/tools/makefont.c +++ b/tools/makefont.c @@ -40,7 +40,8 @@ * and the UTF-8 glyphs necessary for canvas rotation and mirroring. */ static unsigned int const blocklist[] = { - 0x0000, 0x0080, /* Basic latin: A, B, C, a, b, c */ + 0x0020, 0x0080, /* Basic latin: A, B, C, a, b, c */ +#if 0 0x0080, 0x0100, /* Latin-1 Supplement: Ä, Ç, å, ß */ 0x0100, 0x0180, /* Latin Extended-A: Ā č Ō œ */ 0x0180, 0x0250, /* Latin Extended-B: Ǝ Ƹ */ @@ -63,6 +64,7 @@ static unsigned int const blocklist[] = 0x30a0, 0x3100, /* Katakana: ロ ル */ 0xff00, 0xfff0, /* Halfwidth and Fullwidth Forms: A, B, C, a, b, c */ 0x10400, 0x10450, /* Deseret: 𐐒 𐐋 */ +#endif 0, 0 }; @@ -317,8 +319,22 @@ int main(int argc, char *argv[]) printf_unicode(>ab[n]); if(gtab[n].same_as == n) - printf_hex(" */ %s\n", - glyph_data + gtab[n].data_offset, gtab[n].data_size); + { + char const *lut = " .:nmW@"; + printf("\n"); + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < gtab[n].data_width; ++x) + { + int val = glyph_data[gtab[n].data_offset + y * gtab[n].data_width + x]; + char ch = lut[val * val * 7 / 256 / 256]; + printf("%c%c", ch, ch); + } + printf("\n"); + } + //printf_hex(" */ %s\n", + // glyph_data + gtab[n].data_offset, gtab[n].data_size); + } else { printf(" is ");