Подробности
[В начало]
Проблема в реализации № S0797
Краткое описание
Обработка некоторых Type 42 - шрифтов приводит к invalid free()
Подробное описание
При обработке Type 42 - шрифта FreeMono.t42 происходит invalid free() в FT_Done_Face(), что демонстрирует прикреплённый пример. Для некоторых других Type 42 - шрифтов такого сбоя не происходит.
Шрифт FreeMono.t42 получен с помощью системы FontForge (http://fontforge.sourceforge.net/) из шрифта FreeMono.ttf (http://ftp.gnu.org/gnu/freefont/).
Данный сбой проявляется и в версии Freetype2 от 2009.04.30, взятой из git-репозитория.
Запуск данного примера под Valgrind дал следующее:==10238== Invalid free() / delete / delete[] ==10238== at 0x4C265AF: free (vg_replace_malloc.c:323) ==10238== by 0x4E3903E: ft_free (ftsystem.c:158) ==10238== by 0x4E45D6A: ft_mem_free (ftutil.c:171) ==10238== by 0x4E7A4EF: T42_Face_Done (t42objs.c:407) ==10238== by 0x4E3C27C: destroy_face (ftobjs.c:865) ==10238== by 0x4E3E01F: FT_Done_Face (ftobjs.c:2227) ==10238== by 0x4008C8: main (sample_t42.c:41) ==10238== Address 0x5660000 is not stack'd, malloc'd or (recently) free'd
В файле t42objs.c сбой происходит при вызове FT_FREE (info->version)
Под отладкой удалось выяснить, что поля структуры info
, за исключением info->version
, заполнены данными, похожими на правильные. В поле version
должен быть указатель на FT_String
, но реально там находится неверный адрес, что и приводит к invalid free().
Т.е., вероятно, есть какая-то проблема при загрузке шрифта, а не в T42_Face_Done().
При запуске программы ftview для FreeMono.t42 происходит crash по тем же причинам. Результаты анализа с помощью Valgrind здесь аналогичны приведённым выше.
Раздел стандарта
Linux Standard Base Desktop Specification 3.2, Chapter 12. Libraries, 12.1 Interfaces for libfreetype, который ссылается на FreeType-2.1.10 API Reference
Компонент
freetype 2.3.9
Принято
Статус
Исправлено в freetype 2.3.10
[В начало]