Accepting request 875423 from home:jmoellers:branches:multimedia:libs

OBS-URL: https://build.opensuse.org/request/show/875423
OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/libcaca?expand=0&rev=56
This commit is contained in:
Илья Индиго 2021-02-26 14:37:21 +00:00 committed by Git OBS Bridge
parent 040c3a902c
commit daa9d412bc
3 changed files with 632 additions and 1 deletions

View File

@ -0,0 +1,623 @@
Index: libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/canvas.c
===================================================================
--- libcaca-da28e9684ef445ac8d42745644336b8a75c01855.orig/caca/canvas.c
+++ libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/canvas.c
@@ -45,6 +45,7 @@ static int caca_resize(caca_canvas_t *,
*
* If an error occurs, NULL is returned and \b errno is set accordingly:
* - \c EINVAL Specified width or height is invalid.
+ * - \c EOVERFLOW Specified width and height overflowed
* - \c ENOMEM Not enough memory for the requested canvas size.
*
* \param width The desired canvas width
@@ -200,6 +201,7 @@ int caca_unmanage_canvas(caca_canvas_t *
*
* If an error occurs, -1 is returned and \b errno is set accordingly:
* - \c EINVAL Specified width or height is invalid.
+ * - \c EOVERFLOW Specified width and height overflowed.
* - \c EBUSY The canvas is in use by a display driver and cannot be resized.
* - \c ENOMEM Not enough memory for the requested canvas size. If this
* happens, the canvas handle becomes invalid and should not be used.
@@ -365,6 +367,14 @@ int caca_resize(caca_canvas_t *cv, int w
{
int x, y, f, old_width, old_height, new_size, old_size;
+ /* Check for overflow */
+ 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;
@@ -375,7 +385,6 @@ int caca_resize(caca_canvas_t *cv, int w
* dirty rectangle handling */
cv->width = width;
cv->height = height;
- new_size = width * height;
/* If width or height is smaller (or both), we have the opportunity to
* reduce or even remove dirty rectangles */
Index: libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/codec/import.c
===================================================================
--- libcaca-da28e9684ef445ac8d42745644336b8a75c01855.orig/caca/codec/import.c
+++ libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/codec/import.c
@@ -61,6 +61,7 @@ static ssize_t import_caca(caca_canvas_t
*
* If an error occurs, -1 is returned and \b errno is set accordingly:
* - \c ENOMEM Not enough memory to allocate canvas.
+ * - \c EOVERFLOW Importing data caused a value overflow.
* - \c EINVAL Invalid format requested.
*
* \param cv A libcaca canvas in which to import the file.
Index: libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/codec/text.c
===================================================================
--- libcaca-da28e9684ef445ac8d42745644336b8a75c01855.orig/caca/codec/text.c
+++ libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/codec/text.c
@@ -46,7 +46,7 @@ ssize_t _import_text(caca_canvas_t *cv,
char const *text = (char const *)data;
unsigned int width = 0, height = 0, x = 0, y = 0, i;
- caca_set_canvas_size(cv, width, height);
+ caca_set_canvas_size(cv, 0, 0);
for(i = 0; i < size; i++)
{
@@ -70,15 +70,19 @@ ssize_t _import_text(caca_canvas_t *cv,
if(y >= height)
height = y + 1;
- caca_set_canvas_size(cv, width, height);
+ if (caca_set_canvas_size(cv, width, height) < 0)
+ return -1;
}
caca_put_char(cv, x, y, ch);
x++;
}
- if(y > height)
- caca_set_canvas_size(cv, width, height = y);
+ if (y > height)
+ {
+ if (caca_set_canvas_size(cv, width, height = y) < 0)
+ return -1;
+ }
return (ssize_t)size;
}
@@ -431,7 +435,8 @@ ssize_t _import_ansi(caca_canvas_t *cv,
{
savedattr = caca_get_attr(cv, -1, -1);
caca_set_attr(cv, im.clearattr);
- caca_set_canvas_size(cv, width = x + wch, height);
+ if (caca_set_canvas_size(cv, width = x + wch, height) < 0)
+ return -1;
caca_set_attr(cv, savedattr);
}
else
@@ -448,7 +453,8 @@ ssize_t _import_ansi(caca_canvas_t *cv,
caca_set_attr(cv, im.clearattr);
if(growy)
{
- caca_set_canvas_size(cv, width, height = y + 1);
+ if (caca_set_canvas_size(cv, width, height = y + 1) < 0)
+ return -1;
}
else
{
@@ -480,7 +486,8 @@ ssize_t _import_ansi(caca_canvas_t *cv,
{
savedattr = caca_get_attr(cv, -1, -1);
caca_set_attr(cv, im.clearattr);
- caca_set_canvas_size(cv, width, height = y);
+ if (caca_set_canvas_size(cv, width, height = y))
+ return -1;
caca_set_attr(cv, savedattr);
}
Index: libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/t/canvas.cpp
===================================================================
--- libcaca-da28e9684ef445ac8d42745644336b8a75c01855.orig/caca/t/canvas.cpp
+++ libcaca-da28e9684ef445ac8d42745644336b8a75c01855/caca/t/canvas.cpp
@@ -53,18 +53,29 @@ public:
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_width(cv), 0);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_height(cv), 0);
- caca_set_canvas_size(cv, 1, 1);
+ int ret = caca_set_canvas_size(cv, 1, 1);
+ CPPUNIT_ASSERT_EQUAL(ret, 0);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_width(cv), 1);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_height(cv), 1);
- caca_set_canvas_size(cv, 1234, 1001);
+ ret = caca_set_canvas_size(cv, 1234, 1001);
+ CPPUNIT_ASSERT_EQUAL(ret, 0);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_width(cv), 1234);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_height(cv), 1001);
- caca_set_canvas_size(cv, 0, 0);
+ ret = caca_set_canvas_size(cv, 0, 0);
+ CPPUNIT_ASSERT_EQUAL(ret, 0);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_width(cv), 0);
CPPUNIT_ASSERT_EQUAL(caca_get_canvas_height(cv), 0);
+ CPPUNIT_ASSERT_EQUAL(-1, caca_set_canvas_size(cv, -1, 50));
+ CPPUNIT_ASSERT_EQUAL(-1, caca_set_canvas_size(cv, 50, -1));
+ CPPUNIT_ASSERT_EQUAL(-1, caca_set_canvas_size(cv, -1, -1));
+ CPPUNIT_ASSERT_EQUAL(-1, caca_set_canvas_size(cv, INT_MAX / 2, 3));
+ CPPUNIT_ASSERT_EQUAL(-1, caca_set_canvas_size(cv, 3, INT_MAX / 2));
+ CPPUNIT_ASSERT_EQUAL(-1, caca_set_canvas_size(cv, INT_MAX / 2, INT_MAX / 2));
+ CPPUNIT_ASSERT_EQUAL(0, caca_set_canvas_size(cv, 0, 0));
+
caca_free_canvas(cv);
}
Index: libcaca-da28e9684ef445ac8d42745644336b8a75c01855/tools/makefont.c
===================================================================
--- libcaca-da28e9684ef445ac8d42745644336b8a75c01855.orig/tools/makefont.c
+++ libcaca-da28e9684ef445ac8d42745644336b8a75c01855/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: , , , , , */
0x10400, 0x10450, /* Deseret: 𐐒 𐐋 */
+#endif
0, 0
};
@@ -105,10 +107,10 @@ int main(int argc, char *argv[])
if(argc != 5)
{
- fprintf(stderr, "%s: wrong argument count\n", argv[0]);
- fprintf(stderr, "usage: %s <prefix> <font> <dpi> <bpp>\n", argv[0]);
- fprintf(stderr, "eg: %s monospace9 \"Monospace 9\" 96 4\n", argv[0]);
- return -1;
+ fprintf(stderr, "%s: wrong argument count\n", argv[0]);
+ fprintf(stderr, "usage: %s <prefix> <font> <dpi> <bpp>\n", argv[0]);
+ fprintf(stderr, "eg: %s monospace9 \"Monospace 9\" 96 4\n", argv[0]);
+ return -1;
}
prefix = argv[1];
@@ -118,8 +120,8 @@ int main(int argc, char *argv[])
if(dpi == 0 || (bpp != 1 && bpp != 2 && bpp != 4 && bpp != 8))
{
- fprintf(stderr, "%s: invalid argument\n", argv[0]);
- return -1;
+ fprintf(stderr, "%s: invalid argument\n", argv[0]);
+ return -1;
}
fprintf(stderr, "Font \"%s\", %i dpi, %i bpp\n", font, dpi, bpp);
@@ -132,9 +134,9 @@ int main(int argc, char *argv[])
l = pango_layout_new(cx);
if(!l)
{
- fprintf(stderr, "%s: unable to initialise pango\n", argv[0]);
- g_object_unref(cx);
- return -1;
+ fprintf(stderr, "%s: unable to initialise pango\n", argv[0]);
+ g_object_unref(cx);
+ return -1;
}
fd = pango_font_description_from_string(font);
@@ -164,11 +166,11 @@ int main(int argc, char *argv[])
fullglyphs = 0;
for(b = 0; blocklist[b + 1]; b += 2)
{
- blocks++;
- glyphs += blocklist[b + 1] - blocklist[b];
- for(i = blocklist[b]; i < blocklist[b + 1]; i++)
- if(caca_utf32_is_fullwidth(i))
- fullglyphs++;
+ blocks++;
+ glyphs += blocklist[b + 1] - blocklist[b];
+ for(i = blocklist[b]; i < blocklist[b + 1]; i++)
+ if(caca_utf32_is_fullwidth(i))
+ fullglyphs++;
}
control_size = 28 + 12 * blocks + 8 * glyphs;
@@ -180,16 +182,16 @@ int main(int argc, char *argv[])
/* Let's go! */
printf("/* libcaca font file\n");
printf(" * \"%s\": %i dpi, %i bpp, %ix%i/%ix%i glyphs\n",
- font, dpi, bpp, stdwidth, height, fullwidth, height);
+ font, dpi, bpp, stdwidth, height, fullwidth, height);
printf(" * Automatically generated by tools/makefont.c:\n");
printf(" * tools/makefont %s \"%s\" %i %i\n", prefix, font, dpi, bpp);
printf(" */\n");
printf("\n");
printf("static size_t const %s_size = %i;\n",
- prefix, 4 + control_size + data_size);
+ prefix, 4 + control_size + data_size);
printf("static uint8_t const %s_data[%i] =\n",
- prefix, 4 + control_size + data_size);
+ prefix, 4 + control_size + data_size);
printf("{\n");
printf("/* file: */\n");
@@ -217,10 +219,10 @@ int main(int argc, char *argv[])
n = 0;
for(b = 0; blocklist[b + 1]; b += 2)
{
- printf_u32("%s", blocklist[b]);
- printf_u32("%s", blocklist[b + 1]);
- printf_u32("%s\n", n);
- n += blocklist[b + 1] - blocklist[b];
+ printf_u32("%s", blocklist[b]);
+ printf_u32("%s", blocklist[b + 1]);
+ printf_u32("%s\n", n);
+ n += blocklist[b + 1] - blocklist[b];
}
printf("\n");
@@ -228,81 +230,81 @@ int main(int argc, char *argv[])
current_offset = n = 0;
for(b = 0; blocklist[b + 1]; b += 2)
{
- for(i = blocklist[b]; i < blocklist[b + 1]; i++)
- {
- int x, y, bytes, current_width = stdwidth;
- unsigned int k, current_size = stdsize;
-
- if(caca_utf32_is_fullwidth(i))
- {
- current_width = fullwidth;
- current_size = fullsize;
- }
- gtab[n].unicode = i;
- bytes = caca_utf32_to_utf8(gtab[n].buf, gtab[n].unicode);
- gtab[n].buf[bytes] = '\0';
-
- /* Render glyph on a bitmap */
- pango_layout_set_text(l, gtab[n].buf, -1);
- memset(img.buffer, 0, img.pitch * height);
- pango_ft2_render_layout(&img, l, 0, 0);
-
- /* Fix glyphs that we know how to handle better */
- fix_glyph(&img, gtab[n].unicode, current_width, height);
-
- /* Write bitmap as an escaped C string */
- memset(glyph_data + current_offset, 0, current_size);
- k = 0;
- for(y = 0; y < height; y++)
- {
- for(x = 0; x < current_width; x++)
- {
- uint8_t pixel = img.buffer[y * img.pitch + x];
-
- pixel >>= (8 - bpp);
- glyph_data[current_offset + k / 8]
- |= pixel << (8 - bpp - (k % 8));
- k += bpp;
- }
- }
-
- /* Check whether this is the same glyph as another one. Please
- * don't bullshit me about sorting, hashing and stuff like that,
- * our data is small enough for this to work. */
- for(k = 0; k < n; k++)
- {
- if(gtab[k].data_size != current_size)
- continue;
+ for(i = blocklist[b]; i < blocklist[b + 1]; i++)
+ {
+ int x, y, bytes, current_width = stdwidth;
+ unsigned int k, current_size = stdsize;
+
+ if(caca_utf32_is_fullwidth(i))
+ {
+ current_width = fullwidth;
+ current_size = fullsize;
+ }
+ gtab[n].unicode = i;
+ bytes = caca_utf32_to_utf8(gtab[n].buf, gtab[n].unicode);
+ gtab[n].buf[bytes] = '\0';
+
+ /* Render glyph on a bitmap */
+ pango_layout_set_text(l, gtab[n].buf, -1);
+ memset(img.buffer, 0, img.pitch * height);
+ pango_ft2_render_layout(&img, l, 0, 0);
+
+ /* Fix glyphs that we know how to handle better */
+ fix_glyph(&img, gtab[n].unicode, current_width, height);
+
+ /* Write bitmap as an escaped C string */
+ memset(glyph_data + current_offset, 0, current_size);
+ k = 0;
+ for(y = 0; y < height; y++)
+ {
+ for(x = 0; x < current_width; x++)
+ {
+ uint8_t pixel = img.buffer[y * img.pitch + x];
+
+ pixel >>= (8 - bpp);
+ glyph_data[current_offset + k / 8]
+ |= pixel << (8 - bpp - (k % 8));
+ k += bpp;
+ }
+ }
+
+ /* Check whether this is the same glyph as another one. Please
+ * don't bullshit me about sorting, hashing and stuff like that,
+ * our data is small enough for this to work. */
+ for(k = 0; k < n; k++)
+ {
+ if(gtab[k].data_size != current_size)
+ continue;
#if 0
- if(!memcmp(glyph_data + gtab[k].data_offset,
- glyph_data + current_offset, current_size))
- break;
+ if(!memcmp(glyph_data + gtab[k].data_offset,
+ glyph_data + current_offset, current_size))
+ break;
#endif
- }
+ }
- gtab[n].data_offset = current_offset;
- gtab[n].data_width = current_width;
- gtab[n].data_size = current_size;
- gtab[n].same_as = k;
+ gtab[n].data_offset = current_offset;
+ gtab[n].data_width = current_width;
+ gtab[n].data_size = current_size;
+ gtab[n].same_as = k;
- if(k == n)
- current_offset += current_size;
+ if(k == n)
+ current_offset += current_size;
- n++;
- }
+ n++;
+ }
}
printf("/* glyph_info: */\n");
n = 0;
for(b = 0; blocklist[b + 1]; b += 2)
{
- for(i = blocklist[b]; i < blocklist[b + 1]; i++)
- {
- printf_u16("%s", gtab[n].data_width);
- printf_u16("%s", height);
- printf_u32("%s\n", gtab[gtab[n].same_as].data_offset);
- n++;
- }
+ for(i = blocklist[b]; i < blocklist[b + 1]; i++)
+ {
+ printf_u16("%s", gtab[n].data_width);
+ printf_u16("%s", height);
+ printf_u32("%s\n", gtab[gtab[n].same_as].data_offset);
+ n++;
+ }
}
printf("\n");
@@ -310,24 +312,38 @@ int main(int argc, char *argv[])
n = 0;
for(b = 0; blocklist[b + 1]; b += 2)
{
- for(i = blocklist[b]; i < blocklist[b + 1]; i++)
- {
- /* Print glyph value in comment */
- printf("/* ");
- printf_unicode(&gtab[n]);
-
- if(gtab[n].same_as == n)
- printf_hex(" */ %s\n",
- glyph_data + gtab[n].data_offset, gtab[n].data_size);
- else
- {
- printf(" is ");
- printf_unicode(&gtab[gtab[n].same_as]);
- printf(" */\n");
- }
+ for(i = blocklist[b]; i < blocklist[b + 1]; i++)
+ {
+ /* Print glyph value in comment */
+ printf("/* ");
+ printf_unicode(&gtab[n]);
+
+ if(gtab[n].same_as == n)
+ {
+ 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 ");
+ printf_unicode(&gtab[gtab[n].same_as]);
+ printf(" */\n");
+ }
- n++;
- }
+ n++;
+ }
}
printf("};\n");
@@ -347,74 +363,74 @@ int main(int argc, char *argv[])
*/
static void fix_glyph(FT_Bitmap *i, uint32_t ch,
- unsigned int width, unsigned int height)
+ unsigned int width, unsigned int height)
{
unsigned int x, y;
switch(ch)
{
case 0x00002580: /* ▀ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] = y < height / 2 ? 0xff : 0x00;
- if(height & 1)
- for(x = 0; x < width; x++)
- i->buffer[x + (height / 2) * i->pitch] = 0x7f;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] = y < height / 2 ? 0xff : 0x00;
+ if(height & 1)
+ for(x = 0; x < width; x++)
+ i->buffer[x + (height / 2) * i->pitch] = 0x7f;
+ break;
case 0x00002584: /* ▄ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] = y < height / 2 ? 0x00 : 0xff;
- if(height & 1)
- for(x = 0; x < width; x++)
- i->buffer[x + (height / 2) * i->pitch] = 0x7f;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] = y < height / 2 ? 0x00 : 0xff;
+ if(height & 1)
+ for(x = 0; x < width; x++)
+ i->buffer[x + (height / 2) * i->pitch] = 0x7f;
+ break;
case 0x0000258c: /* ▌ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] = x < width / 2 ? 0xff : 0x00;
- if(width & 1)
- for(y = 0; y < height; y++)
- i->buffer[(width / 2) + y * i->pitch] = 0x7f;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] = x < width / 2 ? 0xff : 0x00;
+ if(width & 1)
+ for(y = 0; y < height; y++)
+ i->buffer[(width / 2) + y * i->pitch] = 0x7f;
+ break;
case 0x00002590: /* ▐ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] = x < width / 2 ? 0x00 : 0xff;
- if(width & 1)
- for(y = 0; y < height; y++)
- i->buffer[(width / 2) + y * i->pitch] = 0x7f;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] = x < width / 2 ? 0x00 : 0xff;
+ if(width & 1)
+ for(y = 0; y < height; y++)
+ i->buffer[(width / 2) + y * i->pitch] = 0x7f;
+ break;
case 0x000025a0: /* ■ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] =
- (y >= height / 4) && (y < 3 * height / 4) ? 0xff : 0x00;
- if(height & 3)
- for(x = 0; x < width; x++) /* FIXME: could be more precise */
- i->buffer[x + (height / 4) * i->pitch] =
- i->buffer[x + (3 * height / 4) * i->pitch] = 0x7f;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] =
+ (y >= height / 4) && (y < 3 * height / 4) ? 0xff : 0x00;
+ if(height & 3)
+ for(x = 0; x < width; x++) /* FIXME: could be more precise */
+ i->buffer[x + (height / 4) * i->pitch] =
+ i->buffer[x + (3 * height / 4) * i->pitch] = 0x7f;
+ break;
case 0x00002588: /* █ */
- memset(i->buffer, 0xff, height * i->pitch);
- break;
+ memset(i->buffer, 0xff, height * i->pitch);
+ break;
case 0x00002593: /* ▓ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] =
- ((x + 2 * (y & 1)) & 3) ? 0xff : 0x00;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] =
+ ((x + 2 * (y & 1)) & 3) ? 0xff : 0x00;
+ break;
case 0x00002592: /* ▒ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] = ((x + y) & 1) ? 0xff : 0x00;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] = ((x + y) & 1) ? 0xff : 0x00;
+ break;
case 0x00002591: /* ░ */
- for(y = 0; y < height; y++)
- for(x = 0; x < width; x++)
- i->buffer[x + y * i->pitch] =
- ((x + 2 * (y & 1)) & 3) ? 0x00 : 0xff;
- break;
+ for(y = 0; y < height; y++)
+ for(x = 0; x < width; x++)
+ i->buffer[x + y * i->pitch] =
+ ((x + 2 * (y & 1)) & 3) ? 0x00 : 0xff;
+ break;
}
}
@@ -425,9 +441,9 @@ static int printf_unicode(struct glyph *
wr += printf("U+%.04X: \"", g->unicode);
if(g->unicode < 0x20 || (g->unicode >= 0x7f && g->unicode <= 0xa0))
- wr += printf("\\x%.02x\"", g->unicode);
+ wr += printf("\\x%.02x\"", g->unicode);
else
- wr += printf("%s\"", g->buf);
+ wr += printf("%s\"", g->buf);
return wr;
}
@@ -450,7 +466,7 @@ static int printf_hex(char const *fmt, u
char *parser = buf;
while(bytes--)
- parser += sprintf(parser, "%i,", (unsigned int)*data++);
+ parser += sprintf(parser, "%i,", (unsigned int)*data++);
parser[0] = '\0';
return printf(fmt, buf);

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Fri Feb 26 13:58:41 UTC 2021 - Josef Möllers <josef.moellers@suse.com>
- More overflow prevention of multiplying large ints
[bsc#1182731, CVE-2021-3410, libcaca-bsc1182731-prevent-overflow.patch]
-------------------------------------------------------------------
Tue Mar 10 15:20:55 UTC 2020 - Josef Möllers <josef.moellers@suse.com>

View File

@ -1,7 +1,7 @@
#
# spec file for package libcaca
#
# Copyright (c) 2020 SUSE LLC
# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -37,6 +37,7 @@ Patch10: libcaca-ncurses6.patch
Patch11: libcaca-variable-type.patch
Patch12: Bug1120502-add_cast_to_prevent_overflow.patch
Patch13: Bug1143286_libcaca_configure_ac_chg_for_lto.patch
Patch14: libcaca-bsc1182731-prevent-overflow.patch
BuildRequires: doxygen
BuildRequires: fdupes
BuildRequires: freeglut-devel
@ -142,6 +143,7 @@ drawing, triangle filling and sprite blitting.
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
RUBY="ruby-`echo %{rb_ver} | sed 's|\.[^\.]*$||'`"
find . -type f -exec sed -i "s|ruby-1.9|$RUBY|" \{\} \;
pushd python