GKI 16-6.12 android-mainline errata

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 ve CONFIG_OF_DYNAMIC'u seçer. !OF_DYNAMIC ile of_node_get() ve of_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üğümde of_node_put() çağrısı yapar. Bu işlevleri çağırmadan önce bir of_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'dan char * 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()
      • 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()
    • Daha önce bahsedilen değişiklik Linux açılırken 6.12-rc4 (bkz. aosp/3315251) geri yüklendi ve CONFIG_OF_DYNAMIC yeniden etkinleştirilir ve hatalı sürücüler ortaya çıkabilir.