GKI 16-6.12 android-mainline errata

Na tej stronie opisujemy ważne problemy i poprawki błędów wykryte w android-mainline, które mogą być istotne dla partnerów.

1 listopada 2024 roku

  • Linux 6.12-rc4
    • Podsumowanie: CONFIG_OF_DYNAMIC może powodować poważne regresje w przypadku sterowników z błędami.
    • Szczegóły: podczas łączenia Linuksa 6.12-rc1android-mainline zauważyliśmy problemy z wczytywaniem sterowników spoza drzewa. Zmiana, która ujawniała błędy sterownika, została zidentyfikowana jako zatwierdzenie 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") i tymczasowo ją przywróciliśmy w aosp/3287735. Zmiana wybiera CONFIG_OF_OVERLAY, które z kolei wybiera CONFIG_OF_DYNAMIC. W funkcji !OF_DYNAMIC zliczanie odniesień w przypadku elementów of_node_get() i of_node_put() zostało wyłączone, ponieważ są zaimplementowane jako noops. Ponowne włączenie OF_DYNAMIC naraża kierowców na problemy z niewłaściwym zastosowaniem uwzględniania konwersji w przypadku usługi struct device_node. Powoduje to wystąpienie różnych typów błędów, takich jak uszkodzenie pamięci, używanie po zwolnieniu z używania czy wyciek pamięci.
    • Wszystkie przypadki użycia interfejsów API związanych z parsowaniem OF muszą zostać sprawdzone. Poniższa lista jest częściowa – zawiera jednak przypadki, które zaobserwowaliśmy:
      • Użycie po okresie próbnym:
        • Ponowne użycie tego samego argumentu device_node: te funkcje wywołują of_node_put() w danym węźle. Przed ich wywołaniem może być konieczne dodanie argumentu of_node_get() (np. gdy funkcja jest wywoływana wielokrotnie z tym samym węzłem jako argumentem):
          • 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()
        • Użycie device_node po dowolnym wyjściu z pewnych pętli:
          • for_each_available_child_of_node_scoped()
          • for_each_available_child_of_node()
          • for_each_child_of_node_scoped()
          • for_each_child_of_node()
        • Przechowywanie bezpośrednich wskazówek do właściwości char *device_node, na przykład za pomocą:
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • Wycieki pamięci:
        • Pobieranie device_node i zapominanie o odwoływaniu go (of_node_put()). Węzły zwracane przez te elementy muszą zostać zwolnione w określonym momencie:
          • 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()
      • Zachowywanie elementu device_node z iteracji w pętli. Jeśli wracasz do kodu lub przerywasz go, musisz w pewnym momencie usunąć pozostałe odwołania:
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • Wspomniana wcześniej zmiana została przywrócona podczas uruchamiania Linuksa 6.12-rc4 (patrz aosp/3315251), co ponownie włączyło CONFIG_OF_DYNAMIC i potencjalnie spowodowało ujawnienie wadliwych sterowników.