Errata Android-mainline GKI 16-6.12

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 dans android-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 commit 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data"). Nous l'avons temporairement annulée dans aosp/3287735. La modification sélectionne CONFIG_OF_OVERLAY, qui sélectionne CONFIG_OF_DYNAMIC. Avec !OF_DYNAMIC, le comptage des références sur of_node_get() et of_node_put() est effectivement désactivé, car ils sont implémentés en tant que noops. L'activation de OF_DYNAMIC expose à nouveau des problèmes dans les pilotes qui implémentent de manière incorrecte le comptage des références pour struct 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 appellent of_node_put() sur le nœud donné et doivent peut-être ajouter un of_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 de device_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()
      • 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()
      • 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()
    • 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.