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
mitandroid-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 Commit274aff8711b2 ("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 wirdCONFIG_OF_OVERLAY
ausgewählt, wodurchCONFIG_OF_DYNAMIC
ausgewählt wird. Mit!OF_DYNAMIC
ist die Referenzzählung fürof_node_get()
undof_node_put()
effektiv deaktiviert, da sie alsnoops
implementiert sind. WennOF_DYNAMIC
wieder aktiviert wird, treten Probleme in Treibern auf, die die Referenzzählung fürstruct 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 rufenof_node_put()
auf dem angegebenen Knoten auf. Möglicherweise muss vor dem Aufruf einof_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 ausdevice_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()
- Wiederverwendung desselben
- 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()
- Use after free (UAF):
- Die zuvor erwähnte Änderung wurde beim Landing von Linux
6.12-rc4
(siehe aosp/3315251) wiederhergestellt, in demCONFIG_OF_DYNAMIC
wieder aktiviert wurde und möglicherweise fehlerhafte Treiber zur Verfügung gestellt wurden.
- Zusammenfassung: