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
aandroid-mainline
abbiamo riscontrato problemi di mancato caricamento dei driver out-of-tree. La modifica che ha esposto i bug del driver è stata identificata come commit274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")
e abbiamo annullato temporaneamente la modifica in aosp/3287735. La modifica selezionaCONFIG_OF_OVERLAY
, che selezionaCONFIG_OF_DYNAMIC
. Con!OF_DYNAMIC
, il conteggio dei riferimenti suof_node_get()
eof_node_put()
è effettivamente disattivato in quanto implementati comenoops
. L'attivazione di nuovo diOF_DYNAMIC
espone problemi nei driver che implementano in modo errato il conteggio dei riferimenti perstruct 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 chiamanoof_node_put()
sul nodo specificato e potrebbero dover aggiungere unof_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 *
dadevice_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()
- Riutilizzo dello stesso argomento
- 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()
- Recupero di un
- 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()
- Utilizzo dopo la prova senza costi (UAF):
- La modifica menzionata in precedenza è stata ripristinata durante il caricamento di Linux
6.12-rc4
(vedi aosp/3315251) riattivandoCONFIG_OF_DYNAMIC
e potenzialmente esponendo i driver con errori.
- Riepilogo: