errata GKI 16-6.12 con mainline android

Questa pagina descrive problemi importanti e correzioni di bug rilevati su android-mainline che potrebbero essere significativi per i partner.

1° novembre 2024

  • Lanciato Linux 6.12-rc4
    • Riepilogo: CONFIG_OF_DYNAMIC potrebbe causare gravi regressioni per i driver con errori.
    • I dettagli: durante l'unione di Linux 6.12-rc1 a android-mainline abbiamo riscontrato problemi di mancato caricamento dei driver out-of-tree. La modifica che ha esposto i bug del driver è stata identificata come commit 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") e abbiamo annullato temporaneamente la modifica in aosp/3287735. La modifica seleziona CONFIG_OF_OVERLAY, che seleziona CONFIG_OF_DYNAMIC. Con !OF_DYNAMIC, il conteggio dei riferimenti su of_node_get() e of_node_put() è effettivamente disattivato in quanto implementati come noops. L'attivazione di nuovo di OF_DYNAMIC espone problemi nei driver che implementano in modo errato il conteggio dei riferimenti per struct device_node. Ciò causa vari tipi di errori, come la corruzione della memoria, l'uso dopo il rilascio e le perdite di memoria.
    • Tutti gli utilizzi delle API correlate all'analisi OF devono essere controllati. L'elenco che segue è parziale, ma contiene casi che abbiamo osservato:
      • Utilizzo dopo la prova senza costi (UAF):
        • Riutilizzo dello stesso argomento device_node: queste funzioni chiamano of_node_put() sul nodo specificato e potrebbero dover aggiungere un of_node_get() prima di chiamarle (ad esempio, quando vengono chiamate più volte con lo stesso nodo come argomento):
          • 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()
        • Utilizzo di device_node dopo qualsiasi tipo di uscita da determinati loop:
          • for_each_available_child_of_node_scoped()
          • for_each_available_child_of_node()
          • for_each_child_of_node_scoped()
          • for_each_child_of_node()
        • Mantiene i puntatori diretti alle proprietà char * da device_node, ad esempio utilizzando:
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • Perdite di memoria:
        • Recupero di un device_node e dimenticare di annullare la referenza (of_node_put()). A un certo punto i nodi restituiti dovranno essere liberati:
          • 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()
      • Mantenimento di un device_node da un'iterazione del ciclo. Se torni o interrompi da quanto segue, devi eliminare il riferimento rimanente a un certo punto:
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • La modifica menzionata in precedenza è stata ripristinata durante il caricamento di Linux 6.12-rc4 (vedi aosp/3315251) riattivando CONFIG_OF_DYNAMIC e potenzialmente esponendo i driver con errori.