GKI 16-6.12 android-mainline errata

Auf dieser Seite werden wichtige Probleme und Fehlerkorrekturen beschrieben, die bei android-mainline gefunden wurden und für Partner von Bedeutung sein könnten.

1. November 2024

  • Linux 6.12-rc4 veröffentlicht
    • Zusammenfassung: CONFIG_OF_DYNAMIC kann bei fehlerhaften Treibern zu schwerwiegenden Rückschritten führen.
    • Details: Beim Zusammenführen von Linux 6.12-rc1 mit android-mainline haben wir Probleme festgestellt, bei denen nicht im Stamm enthaltene Treiber nicht geladen werden konnten. Die Änderung, die die Treiberfehler hervorgerufen hat, wurde als Commit 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") identifiziert und vorübergehend in aosp/3287735 rückgängig gemacht. Durch die Änderung wird CONFIG_OF_OVERLAY ausgewählt, wodurch CONFIG_OF_DYNAMIC ausgewählt wird. Mit !OF_DYNAMIC ist die Referenzzählung für of_node_get() und of_node_put() effektiv deaktiviert, da sie als noops implementiert sind. Wenn OF_DYNAMIC wieder aktiviert wird, treten Probleme in Treibern auf, die die Referenzzählung für struct device_node falsch implementieren. Dies führt zu verschiedenen Arten von Fehlern wie Speicherbeschädigung, Use-After-Free und Speicherlecks.
    • Sämtliche Verwendungen von OF-Parsing-APIs müssen überprüft werden. Die folgende Liste ist unvollständig, enthält aber Fälle, die wir beobachtet haben:
      • Use after free (UAF):
        • Wiederverwendung desselben device_node-Arguments: Diese Funktionen rufen of_node_put() auf dem angegebenen Knoten auf. Möglicherweise muss vor dem Aufruf ein of_node_get() hinzugefügt werden (z. B. wenn wiederholt mit demselben Knoten als Argument aufgerufen wird):
          • 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()
        • Verwendung von device_node nach jeder Art von Beendigung bestimmter Schleifen:
          • for_each_available_child_of_node_scoped()
          • for_each_available_child_of_node()
          • for_each_child_of_node_scoped()
          • for_each_child_of_node()
        • Direkte Verweise auf char *-Properties aus device_node beibehalten, z. B. mit:
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • Speicherlecks:
        • device_node abrufen und vergessen, die Referenz aufzuheben (of_node_put()). Die von diesen zurückgegebenen Knoten müssen irgendwann freigegeben werden:
          • 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()
      • device_node in einer Schleifeniteration beibehalten. Wenn Sie innerhalb der folgenden Elemente zurückkehren oder eine Unterbrechung einfügen, müssen Sie die verbleibende Referenz irgendwann löschen:
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • Die zuvor erwähnte Änderung wurde beim Landing von Linux 6.12-rc4 (siehe aosp/3315251) wiederhergestellt, in dem CONFIG_OF_DYNAMIC wieder aktiviert wurde und möglicherweise fehlerhafte Treiber zur Verfügung gestellt wurden.