На этой странице описаны важные проблемы и исправления ошибок, обнаруженные в android-mainline , которые могут иметь значение для партнеров.
15 ноября 2024 г.
Clang обновлен до версии 19.0.1 для
android-mainlineиandroid16-6.12- Краткое описание: В новой версии Clang реализована функция проверки границ массивов, при которой размер массива хранится в отдельной переменной, связанной с массивом с помощью атрибута
__counted_by. Эта функция может вызвать сбой ядра, если размер массива не будет обновлен должным образом. Сообщение об ошибке выглядит следующим образом:
UBSAN: array-index-out-of-bounds in common/net/wireless/nl80211.c index 0 is out of range for type 'struct ieee80211_channel *[] __counted_by(n_channels)' (aka 'struct ieee80211_channel *[]')Подробности: Функция проверки границ (bounds sanitizer) необходима для защиты целостности ядра путем обнаружения доступа за пределы допустимого диапазона. При включенной опции
CONFIG_UBSAN_TRAPпроверка границ вызывает панику ядра при обнаружении любого такого доступа.- Предыдущая версия средства проверки границ массива проверяла только массивы фиксированного размера и не могла проверять динамически выделенные массивы. Новая версия использует атрибут
__counted_byдля определения границ массива во время выполнения и обнаружения большего количества случаев доступа за пределы выделенной области. Однако в некоторых случаях доступ к массиву осуществляется до того, как будет установлена переменная размера, что запускает проверку границ и вызывает панику ядра. Для решения этой проблемы установите размер массива сразу после выделения соответствующей памяти, как показано в aosp/3343204 .
- Предыдущая версия средства проверки границ массива проверяла только массивы фиксированного размера и не могла проверять динамически выделенные массивы. Новая версия использует атрибут
О
CONFIG_UBSAN_SIGNED_WRAP: Новая версия Clang устраняет переполнение и недополнение знаковых целых чисел, несмотря на флаг компилятора-fwrapv. Флаг-fwrapvпредназначен для обработки знаковых целых чисел как беззнаковых целых чисел в дополнительном коде с определенным поведением переполнения.- Хотя проверка на переполнение знаковых целых чисел в ядре Linux может помочь выявить ошибки, существуют случаи, когда переполнение является преднамеренным, например, с
atomic_long_t. В результатеCONFIG_UBSAN_SIGNED_WRAPбыл отключен , чтобы UBSAN мог функционировать исключительно как средство проверки границ.
- Хотя проверка на переполнение знаковых целых чисел в ядре Linux может помочь выявить ошибки, существуют случаи, когда переполнение является преднамеренным, например, с
О
CONFIG_UBSAN_TRAP: UBSAN настроен на запуск паники ядра при обнаружении проблемы для защиты целостности ядра. Однако мы отключили это поведение с 23 октября по 12 ноября . Мы сделали это, чтобы разблокировать обновление компилятора, пока мы исправляли известные проблемы с__counted_by.
- Краткое описание: В новой версии Clang реализована функция проверки границ массивов, при которой размер массива хранится в отдельной переменной, связанной с массивом с помощью атрибута
1 ноября 2024 г.
- Выпуск Linux 6.12-rc4
- Краткое описание: Параметр
CONFIG_OF_DYNAMICпотенциально может вызывать серьезные регрессии в неисправных драйверах. - Подробности: При слиянии Linux
6.12-rc1вandroid-mainlineмы заметили проблемы с загрузкой драйверов, отсутствующих в основном репозитории. Изменение, выявившее ошибки в драйверах, было идентифицировано как коммит274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data"), и мы временно отменили его в aosp/3287735 . Изменение выбираетCONFIG_OF_OVERLAY, который, в свою очередь, выбираетCONFIG_OF_DYNAMIC. При!OF_DYNAMICподсчет ссылок в функцияхof_node_get()иof_node_put()фактически отключается, поскольку они реализованы какnoops. Повторное включениеOF_DYNAMICвыявляет проблемы в драйверах, неправильно реализующих подсчет ссылок дляstruct device_node. Это приводит к различным типам ошибок, таким как повреждение памяти, использование памяти после освобождения и утечки памяти. - Необходимо проверить все случаи использования API, связанных с анализом OF. Приведенный ниже список является неполным, но содержит примеры, которые мы наблюдали:
- Использовать после освобождения (UAF):
- Повторное использование одного и того же аргумента
device_node: Эти функции вызываютof_node_put()для заданного узла, и перед их вызовом может потребоваться добавитьof_node_get()(например, при многократном вызове с одним и тем же узлом в качестве аргумента):-
of_find_compatible_node() -
of_find_node_by_name() -
of_find_node_by_path() -
of_find_node_by_type() -
of_get_next_cpu_node() -
of_get_next_parent() -
of_get_next_child() -
of_get_next_available_child() -
of_get_next_reserved_child() -
of_find_node_with_property() -
of_find_matching_node_and_match()
-
- Использование
device_nodeпосле выхода из определённых циклов любого типа:-
for_each_available_child_of_node_scoped() -
for_each_available_child_of_node() -
for_each_child_of_node_scoped() -
for_each_child_of_node()
-
- Сохранение прямых указателей на свойства типа
char *изdevice_node, например, с помощью:-
const char *foo = struct device_node::name -
of_property_read_string() -
of_property_read_string_array() -
of_property_read_string_index() -
of_get_property()
-
- Повторное использование одного и того же аргумента
- Утечки памяти:
- Получение
device_nodeи забывание отменить его ссылку (of_node_put()). Узлы, возвращаемые этими методами, необходимо освободить в какой-то момент:-
of_find_compatible_node() -
of_find_node_by_name() -
of_find_node_by_path() -
of_find_node_by_type() -
of_find_node_by_phandle() -
of_parse_phandle() -
of_find_node_opts_by_path() -
of_get_next_cpu_node() -
of_get_compatible_child() -
of_get_child_by_name() -
of_get_parent() -
of_get_next_parent() -
of_get_next_child() -
of_get_next_available_child() -
of_get_next_reserved_child() -
of_find_node_with_property() -
of_find_matching_node_and_match()
-
- Получение
- Сохранение узла
device_nodeиз итерации цикла. Если вы возвращаете значение или прерываете выполнение из следующего кода, вам необходимо в какой-то момент удалить оставшуюся ссылку:-
for_each_available_child_of_node() -
for_each_child_of_node() -
for_each_node_by_type() -
for_each_compatible_node() -
of_for_each_phandle()
-
- Использовать после освобождения (UAF):
- Упомянутое ранее изменение было восстановлено при установке Linux
6.12-rc4(см. aosp/3315251 ), что позволило снова включитьCONFIG_OF_DYNAMICи потенциально выявить неисправные драйверы.
- Краткое описание: Параметр