Errata android-mainline GKI 16-6.12

Halaman ini menjelaskan masalah penting dan perbaikan bug yang ditemukan di android-mainline yang mungkin signifikan bagi partner.

1 November 2024

  • Peluncuran Linux 6.12-rc4
    • Ringkasan: CONFIG_OF_DYNAMIC berpotensi menyebabkan regresi parah untuk driver yang rusak.
    • Detailnya: Saat menggabungkan 6.12-rc1 Linux ke dalam android-mainline, kami melihat masalah pada driver di luar hierarki yang gagal dimuat. Perubahan yang mengekspos bug driver diidentifikasi sebagai commit 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") dan kami sementara mengembalikannya di aosp/3287735. Perubahan ini memilih CONFIG_OF_OVERLAY, yang memilih CONFIG_OF_DYNAMIC. Dengan !OF_DYNAMIC, penghitungan referensi di of_node_get() dan of_node_put() secara efektif dinonaktifkan karena diterapkan sebagai noops. Mengaktifkan OF_DYNAMIC lagi akan mengekspos masalah pada driver yang salah menerapkan penghitungan referensi untuk struct device_node. Hal ini menyebabkan berbagai jenis error seperti kerusakan memori, use-after-free, dan kebocoran memori.
    • Semua penggunaan API terkait penguraian OF harus diperiksa. Daftar berikut bersifat sebagian, tetapi berisi kasus yang telah kami amati:
      • Use after free (UAF):
        • Penggunaan kembali argumen device_node yang sama: Fungsi tersebut memanggil of_node_put() pada node yang diberikan, yang mungkin perlu menambahkan of_node_get() sebelum memanggilnya (misalnya, saat memanggil berulang kali dengan node yang sama sebagai argumen):
          • 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()
        • Penggunaan device_node setelah jenis keluar dari loop tertentu:
          • for_each_available_child_of_node_scoped()
          • for_each_available_child_of_node()
          • for_each_child_of_node_scoped()
          • for_each_child_of_node()
        • Mempertahankan pointer langsung ke properti char * dari device_node, misalnya, menggunakan:
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • Kebocoran memori:
        • Mendapatkan device_node dan lupa untuk membatalkan referensinya (of_node_put()). Node yang ditampilkan dari ini perlu dibebaskan pada suatu saat:
          • 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()
      • Mempertahankan device_node dari iterasi loop. Jika Anda kembali atau melakukan gangguan dari dalam objek berikut, Anda harus menghapus referensi yang tersisa suatu saat:
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • Perubahan yang disebutkan sebelumnya dipulihkan saat meluncurkan 6.12-rc4 Linux (lihat aosp/3315251) yang mengaktifkan CONFIG_OF_DYNAMIC lagi dan berpotensi mengekspos driver yang rusak.