Bu sayfada, android-mainline
'te bulunan ve iş ortakları için önemli olabilecek önemli sorunlar ve hata düzeltmeleri açıklanmaktadır.
1 Kasım 2024
- Linux 6.12-rc4 kullanıma sunuldu
- Özet:
CONFIG_OF_DYNAMIC
, hatalı sürücüler için ciddi regresyonlara neden olabilir. - Ayrıntılar: Linux
6.12-rc1
sürümünüandroid-mainline
ile birleştirirken ağaç dışı sürücülerin yüklenememesiyle ilgili sorunlar olduğunu fark ettik. Sürücünün hatalarını ortaya çıkaran değişiklik,274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")
commit'i olarak tanımlandı ve aosp/3287735 adresinde geçici olarak geri alındı. Değişiklik,CONFIG_OF_OVERLAY
'ü seçer veCONFIG_OF_DYNAMIC
'u seçer.!OF_DYNAMIC
ileof_node_get()
veof_node_put()
'de referans sayımı,noops
olarak uygulandıkları için etkili bir şekilde devre dışı bırakılır.OF_DYNAMIC
'ü tekrar etkinleştirmek,struct device_node
için referans sayımını yanlış uygulayan sürücülerdeki sorunları ortaya çıkarır. Bu durum, bellek bozulması, boşaltıldıktan sonra kullanım ve bellek sızıntısı gibi çeşitli hatalara neden olur. - İlgili API'leri ayrıştırma işlevinin tüm kullanımları kontrol edilmelidir. Aşağıdaki liste kısmidir ancak gözlemlediğimiz durumları içerir:
- Ücretsiz kullanımdan sonra (UAF):
- Aynı
device_node
bağımsız değişkeninin yeniden kullanılması: Bu işlevler, verilen düğümdeof_node_put()
çağrısı yapar. Bu işlevleri çağırmadan önce birof_node_get()
eklemeniz gerekebilir (örneğin, bağımsız değişken olarak aynı düğümle tekrar tekrar çağırırken):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()
- Belirli döngülerden herhangi bir şekilde çıktıktan sonra
device_node
kullanımı:for_each_available_child_of_node_scoped()
for_each_available_child_of_node()
for_each_child_of_node_scoped()
for_each_child_of_node()
device_node
'danchar *
mülklerine doğrudan işaretçiler tutmak (örneğin, aşağıdakileri kullanarak):const char *foo = struct device_node::name
of_property_read_string()
of_property_read_string_array()
of_property_read_string_index()
of_get_property()
- Aynı
- Bellek sızıntısı:
device_node
almak ve referansını kaldırmayı unutmak (of_node_put()
). Bunlardan döndürülen düğümlerin bir noktada serbest bırakılması gerekir: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()
- Döngü iterasyonundan bir
device_node
tutma. Aşağıdakilerden birinde dönüyor veya ara veriyorsanız bir noktada kalan referansı bırakmanız gerekir:for_each_available_child_of_node()
for_each_child_of_node()
for_each_node_by_type()
for_each_compatible_node()
of_for_each_phandle()
- Ücretsiz kullanımdan sonra (UAF):
- Daha önce bahsedilen değişiklik Linux açılırken
6.12-rc4
(bkz. aosp/3315251) geri yüklendi veCONFIG_OF_DYNAMIC
yeniden etkinleştirilir ve hatalı sürücüler ortaya çıkabilir.
- Özet: