На этой странице описаны важные проблемы и исправления ошибок, обнаруженные в 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 *[]')Подробности. Санитайзер границ необходим для защиты целостности ядра путем обнаружения доступа за пределами границ. Если включен параметр
CONFIG_UBSAN_TRAP, то при обнаружении любой ошибки bounds sanitizer вызывает сбой ядра.- Предыдущая версия санитайзера границ проверяла только массивы фиксированного размера и не могла проверять массивы, выделенные динамически. В новой версии для определения границ массива во время выполнения используется атрибут
__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 landing
- Краткое описание:
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::nameof_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и потенциально выявило неисправные драйверы.
- Краткое описание: