Changeset 4851


Ignore:
Timestamp:
Nov 18, 2012, 6:54:57 PM (7 years ago)
Author:
Sam Hocevar
Message:

string: avoid an infinite loop with some invalid UTF-8 sequences, and add a
unit test for the problem. Bug found by Bastian Märkisch <bmaerkisch@web.de>.

Location:
libcaca/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/string.c

    r4840 r4851  
    257257    int len = 0;
    258258
    259     if(y < 0 || y >= (int)cv->height || x >= (int)cv->width)
    260     {
    261         while(*s)
     259    if (y < 0 || y >= (int)cv->height || x >= (int)cv->width)
     260    {
     261        while (*s)
    262262        {
    263263            len += caca_utf32_is_fullwidth(caca_utf8_to_utf32(s, &rd)) ? 2 : 1;
    264             s += rd;
     264            s += rd ? rd : 1;
    265265        }
    266266        return len;
    267267    }
    268268
    269     while(*s)
     269    while (*s)
    270270    {
    271271        uint32_t ch = caca_utf8_to_utf32(s, &rd);
    272272
    273         if(x + len >= -1 && x + len < (int)cv->width)
     273        if (x + len >= -1 && x + len < (int)cv->width)
    274274            caca_put_char(cv, x + len, y, ch);
    275275
    276276        len += caca_utf32_is_fullwidth(ch) ? 2 : 1;
    277         s += rd;
     277        s += rd ? rd : 1;
    278278    }
    279279
  • libcaca/trunk/test/canvas.cpp

    r4333 r4851  
    2626    CPPUNIT_TEST(test_resize);
    2727    CPPUNIT_TEST(test_chars);
     28    CPPUNIT_TEST(test_utf8);
    2829    CPPUNIT_TEST_SUITE_END();
    2930
     
    9596        caca_free_canvas(cv);
    9697    }
     98
     99    void test_utf8()
     100    {
     101        caca_canvas_t *cv;
     102        cv = caca_create_canvas(10, 10);
     103
     104        /* Send only one byte of a 4-byte sequence */
     105        caca_put_str(cv, 0, 0, "\xf0");
     106    }
    97107};
    98108
Note: See TracChangeset for help on using the changeset viewer.