Cette page décrit les problèmes importants et les corrections de bugs détectés sur android-mainline
qui peuvent être importants pour les partenaires.
1er novembre 2024
- Lancement de Linux 6.12-rc4
- Résumé :
CONFIG_OF_DYNAMIC
peut entraîner des régressions graves pour les pilotes défectueux. - Détails : lors de la fusion de
6.12-rc1
Linux dansandroid-mainline
, nous avons constaté des problèmes de chargement des pilotes hors arborescence. La modification qui a exposé les bugs du pilote a été identifiée comme étant le commit274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")
. Nous l'avons temporairement annulée dans aosp/3287735. La modification sélectionneCONFIG_OF_OVERLAY
, qui sélectionneCONFIG_OF_DYNAMIC
. Avec!OF_DYNAMIC
, le comptage des références surof_node_get()
etof_node_put()
est effectivement désactivé, car ils sont implémentés en tant quenoops
. L'activation deOF_DYNAMIC
expose à nouveau des problèmes dans les pilotes qui implémentent de manière incorrecte le comptage des références pourstruct device_node
. Cela entraîne divers types d'erreurs, telles que la corruption de la mémoire, l'utilisation après libération et les fuites de mémoire. - Toutes les utilisations des API liées à l'analyse OF doivent être inspectées. La liste suivante est partielle, mais contient les cas que nous avons observés :
- Utilisation après libération (UAF) :
- Réutilisation du même argument
device_node
: ces fonctions appellentof_node_put()
sur le nœud donné et doivent peut-être ajouter unof_node_get()
avant de les appeler (par exemple, lors d'appels répétés avec le même nœud comme argument) :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()
- Utilisation de
device_node
après tout type de sortie de certaines boucles :for_each_available_child_of_node_scoped()
for_each_available_child_of_node()
for_each_child_of_node_scoped()
for_each_child_of_node()
- Conserver les pointeurs directs vers les propriétés
char *
à partir dedevice_node
, par exemple à l'aide de :const char *foo = struct device_node::name
of_property_read_string()
of_property_read_string_array()
of_property_read_string_index()
of_get_property()
- Réutilisation du même argument
- Fuites de mémoire :
- Obtenir un
device_node
et oublier de le désenregistrer (of_node_put()
). Les nœuds renvoyés par ces éléments doivent être libérés à un moment donné :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()
- Obtenir un
- Conserver un
device_node
à partir d'une itération de boucle. Si vous revenez ou interrompez l'exécution à partir des éléments suivants, vous devez supprimer la référence restante à un moment donné :for_each_available_child_of_node()
for_each_child_of_node()
for_each_node_by_type()
for_each_compatible_node()
of_for_each_phandle()
- Utilisation après libération (UAF) :
- Le changement mentionné précédemment a été restauré lors du déploiement de
6.12-rc4
Linux (voir aosp/3315251), ce qui a réactivéCONFIG_OF_DYNAMIC
et potentiellement exposé des pilotes défectueux.
- Résumé :