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 dalamandroid-mainline
, kami melihat masalah pada driver di luar hierarki yang gagal dimuat. Perubahan yang mengekspos bug driver diidentifikasi sebagai commit274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")
dan kami sementara mengembalikannya di aosp/3287735. Perubahan ini memilihCONFIG_OF_OVERLAY
, yang memilihCONFIG_OF_DYNAMIC
. Dengan!OF_DYNAMIC
, penghitungan referensi diof_node_get()
danof_node_put()
secara efektif dinonaktifkan karena diterapkan sebagainoops
. MengaktifkanOF_DYNAMIC
lagi akan mengekspos masalah pada driver yang salah menerapkan penghitungan referensi untukstruct 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 memanggilof_node_put()
pada node yang diberikan, yang mungkin perlu menambahkanof_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 *
daridevice_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()
- Penggunaan kembali argumen
- 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()
- Mendapatkan
- 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()
- Use after free (UAF):
- Perubahan yang disebutkan sebelumnya dipulihkan saat meluncurkan
6.12-rc4
Linux (lihat aosp/3315251) yang mengaktifkanCONFIG_OF_DYNAMIC
lagi dan berpotensi mengekspos driver yang rusak.
- Ringkasan: