En esta página, se describen los problemas importantes y las correcciones de errores que se encontraron en android-mainline
que podrían ser significativos para los socios.
1 de noviembre de 2024
- Lanzamiento de Linux 6.12-rc4
- Resumen:
CONFIG_OF_DYNAMIC
puede causar regresiones graves en los controladores defectuosos. - Detalles: Durante la combinación de
6.12-rc1
de Linux enandroid-mainline
, notamos problemas con controladores fuera del árbol que no se cargaban. El cambio que expuso los errores del controlador se identificó como confirmación274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")
y lo revirtieron temporalmente en aosp/3287735. El cambio seleccionaCONFIG_OF_OVERLAY
, que seleccionaCONFIG_OF_DYNAMIC
. Con!OF_DYNAMIC
, el recuento de referencias enof_node_get()
yof_node_put()
se inhabilita de manera efectiva, ya que se implementan comonoops
. Volver a habilitarOF_DYNAMIC
expone problemas en los controladores que implementan incorrectamente el recuento de referencias parastruct device_node
. Esto causa varios tipos de errores, como daños en la memoria, uso después de liberar y fugas de memoria. - Se deben inspeccionar todos los usos de las APIs relacionadas con el análisis de OF. La siguiente lista es parcial, pero contiene casos que hemos observado:
- Uso tras la liberación (UAF):
- Reutilización del mismo argumento
device_node
: Esas funciones llaman aof_node_put()
en el nodo determinado y, posiblemente, deban agregar unof_node_get()
antes de llamarlas (por ejemplo, cuando se llama de forma reiterada con el mismo nodo como argumento):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()
- Uso de
device_node
después de cualquier tipo de salida de ciertos bucles:for_each_available_child_of_node_scoped()
for_each_available_child_of_node()
for_each_child_of_node_scoped()
for_each_child_of_node()
- Mantener punteros directos a las propiedades
char *
dedevice_node
, por ejemplo, con lo siguiente:const char *foo = struct device_node::name
of_property_read_string()
of_property_read_string_array()
of_property_read_string_index()
of_get_property()
- Reutilización del mismo argumento
- Fugas de memoria:
- Obtener un
device_node
y olvidar anular la referencia (of_node_put()
). Los nodos que se muestran como resultado deben liberarse en algún momento: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()
- Obtener un
- Mantener un
device_node
de una iteración de bucle Si regresas o haces una pausa desde lo siguiente, debes soltar la referencia restante en algún momento:for_each_available_child_of_node()
for_each_child_of_node()
for_each_node_by_type()
for_each_compatible_node()
of_for_each_phandle()
- Uso tras la liberación (UAF):
- Se restableció el cambio mencionado anteriormente cuando se implementó Linux
6.12-rc4
(consulta aosp/3315251), lo que volvió a habilitarCONFIG_OF_DYNAMIC
y, potencialmente, expuso controladores defectuosos.
- Resumen: