Подробности

[В начало]

Проблема в реализации № 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

Принято

Freetype2 Bug Tracker, #26600

Статус

Исправлено в freetype 2.3.10

[В начало]