Представлен релиз системной библиотеки GNU C Library (glibc) 2.20, которая полностью следует требованиям стандартов ISO C11 и POSIX.1-2008. В подготовке нового выпуска использованы патчи от 69 разработчиков.
Новый выпуск ознаменовал собой завершение процесса слияния с проектом Eglibc (Embedded GLIBC), который развивался синхронно с Glibc и был полностью совместим с ней на уровне API и ABI, отличаясь интеграцией некоторых дополнительных наработок для встраиваемых систем, более низкими системными требованиями, возможностью гибкой настройки компонентов, улучшенной поддержкой кросс-компиляции и кросс-тестирования. Последние два года проекты двигались в сторону возвращения в Glibc наработок Eglibc, к моменту выхода Glibc 2.20 данный процесс завершился и отныне пользователям и разработчикам Eglibc рекомендовано вернуться на Glibc. Выпуск Eglibc 2.19 был последним, версия Eglibc 2.20 не будет выпущена. Ранее применявшие Eglibc дистрибутивы OpenWrt, Mandriva, Debian и Ubuntu уже наметили возвращение на Glibc.
Из добавленных в Glibc 2.20 улучшений можно отметить:
- Требования к минимально поддерживаемому выпуску ядра Linux повышены до 2.6.32 (ранее поддерживались выпуски ядра, начиная с 2.6.16);
- Для систем на основе ядра Linux добавлена поддержка блокировки на уровне описаний файлов (file descriptions, используется для обмена файловыми дескрипторами между процессами и нитями). Штатный интерфейс установки блокировок на файлы расширен средствами для блокировки на уровне описаний файлов (не путать с файловыми дескрипторами) с использованием опций F_OFD_GETLK, F_OFD_SETLK и F_OFD_SETLKW. Блокировка на уровне описания файлов ассоциируются с открытым файлом, а не процессом, т.е. корректно обрабатывает передачу открытого заблокированного файла другому процессу и использование блокировки в многопоточных программах;
- Реализация функции strchr оптимизирована для архитектуры AArch64;
- Реализация функции strcmp оптимизирована для архитектуры ARMv7;
- Изменена логика выполнения тестового набора - процесс тестирования больше не прерывается после первой ошибки и выполняется полностью. Лог всех выявленных при тестировании сбоев сохраняется в файл tests.sum. После завершения тестирования на экран выводится сводка проблем. Для возврата старого поведения следует запускать "make check stop-on-test-failure=y";
- Прекращена поддержка порта am33, который находится в неработоспособном состоянии уже несколько лет;
- Прекращена поддержка макросов тестирования _BSD_SOURCE и _SVID_SOURCE, которые теперь действуют как _DEFAULT_SOURCE с выводом предупреждения;
- Для архитектур s390 и s390x в реализации мьютексов pthread добавлена поддержка аппаратных механизмов проведения транзакций в памяти, определённых в составе набора расширений TX (Transactional Extensions). Внесённое улучшение позволяет увеличить масштабируемость блокировок для существующих программ, при их запуске на системах, поддерживающих расширения TX;
- Отменены изменения структур данных ABI, внесённые для архитектур s390 и s390x (в glibc 2.19 был увеличен размер структур ucontext и jmp_buf);
- Все поддерживаемые архитектуры отныне используют основную директорию sysdeps из состава glibc вместо отдельных директорий в иерархии ports;
- NPTL-реализация POSIXpthreads больше не позиционируется как дополнение и используется по умолчанию в конфигурациях, поддерживающих NPTL, независимо от включения опции "--enable-add-ons";
- Реализация "ленивого" динамического связывания на архитектуре x86-64 приведена к совместимости с кодом приложений, в которых используются инструкции Intel MPX (состояние регистров MPX теперь сохраняется перед обращением к библиотеке);
- Внесено 4 изменения, связанных с безопасностью:
- Прекращена поддержка загружаемых модулей транслитерации gconv, которые не применяются уже более десяти лет. Поддержка обычных модулей преобразования gconv сохранена без изменений, в том числе возможно использовании транслитерации через опцию "//TRANSLIT" и применение спецификатора "//IGNORE".
Удаление кода связано с выявлением уязвимости CVE-2014-5119, первые сообщения о которой были опубликованы ещё в 2005 году. Уязвимость вызвана ошибкой, приводящей к перезаписи одного байта за границей буфера при обработке некорректных данных функцией "__gconv_translit_find()" (iconv/gconv_trans.c). В июле 2014 года проблема вновь всплыла в системе отслеживания ошибок, но участники команды устранения уязвимостей из компании Red Hat скептически отнеслись к этой ошибке и заявили, что она не подлежит эксплуатации, так как встроенные в реализацию malloc средства защиты должны блокировать проявление проблемы. Участники созданной компанией Google команды "Проект Zero" показали, что поверхностный анализ потенциальных уязвимостей не всегда адекватен и подготовили рабочий эксплоит, который может быть применён для организации запуска кода атакующего.
- CVE-2014-0475 - добавлены дополнительные проверки на использование символов "/" и ".." в именах локалей, полученных через переменные окружения группы LC_*. Вызов setlocale при наличии таких имён отныне приводит к ошибке, а также при размещении очень длинных имён;
- CVE-2014-4043 - проблема в реализации posix_spawn_file_actions_addopen, позволяла осуществить подмену аргумента с файловым путём, через разыменования связанной с ним ссылки в последующем вызове posix_spawn;
- CVE-2014-6040 - ошибка в коде iconv, используемом для декодирования набора символов в кодировках IBM933, IBM935, IBM937, IBM939 и IBM1364, могла привести к чтению данных из области за пределами выделенного буфера;
- Прекращена поддержка загружаемых модулей транслитерации gconv, которые не применяются уже более десяти лет. Поддержка обычных модулей преобразования gconv сохранена без изменений, в том числе возможно использовании транслитерации через опцию "//TRANSLIT" и применение спецификатора "//IGNORE".
- Исправлено около 150 ошибок.