* gnu/packages/video.scm (libcaca)[source]: Add patches. * gnu/packages/patches/libcaca-CVE-2021-3410-pt1.patch, gnu/packages/patches/libcaca-CVE-2021-3410-pt2.patch: New files. * gnu/local.mk (dist_patch_DATA): Register them.
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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 <sam@hocevar.net>
 | 
						||
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 ");
 |