Errata de android-mainline de GKI 16-6.12

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 en android-mainline, notamos problemas con controladores fuera del árbol que no se cargaban. El cambio que expuso los errores del controlador se identificó como confirmación 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") y lo revirtieron temporalmente en aosp/3287735. El cambio selecciona CONFIG_OF_OVERLAY, que selecciona CONFIG_OF_DYNAMIC. Con !OF_DYNAMIC, el recuento de referencias en of_node_get() y of_node_put() se inhabilita de manera efectiva, ya que se implementan como noops. Volver a habilitar OF_DYNAMIC expone problemas en los controladores que implementan incorrectamente el recuento de referencias para struct 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 a of_node_put() en el nodo determinado y, posiblemente, deban agregar un of_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 * de device_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()
      • 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()
      • 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()
    • Se restableció el cambio mencionado anteriormente cuando se implementó Linux 6.12-rc4 (consulta aosp/3315251), lo que volvió a habilitar CONFIG_OF_DYNAMIC y, potencialmente, expuso controladores defectuosos.