GKI 16-6.12 android-mainline エラータ

このページでは、android-mainline で確認された、パートナーにとって重要な問題とバグ修正について説明します。

2024 年 11 月 1 日

  • Linux 6.12-rc4 ランディング
    • 概要: CONFIG_OF_DYNAMIC は、ドライバの不具合に重大な回帰を引き起こす可能性があります。
    • 詳細: Linux 6.12-rc1android-mainline に統合する際に、ツリー外のドライバが読み込まれないという問題が発生しました。ドライバのバグを公開した変更は commit 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") として特定され、aosp/3287735 で一時的に元に戻されました。この変更により、CONFIG_OF_OVERLAY が選択され、CONFIG_OF_DYNAMIC が選択されます。!OF_DYNAMIC では、noops として実装されているため、of_node_get()of_node_put() のリファレンス カウントは実質的に無効になります。OF_DYNAMIC を有効にすると、struct device_node のリファレンス カウントを誤って実装しているドライバの問題が再び発生します。これにより、メモリ破損、use-after-free、メモリリークなどのさまざまなタイプのエラーが発生します。
    • OF 解析関連の API の使用をすべて検査する必要があります。以下のリストは一部ですが、確認されているケースが含まれています。
      • 解放後の使用(UAF):
        • 同じ device_node 引数の再利用: これらの関数は、指定されたノードで of_node_put() を呼び出します。呼び出す前に of_node_get() を追加する必要があります(引数として同じノードを繰り返し呼び出す場合など)。
          • 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()
        • 特定のループからのあらゆる種類の終了後に device_node を使用する:
          • 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 から char * プロパティへの直接ポインタを保持する。次に例を示します。
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • メモリリーク:
        • device_node を取得して、その参照解除(of_node_put())を忘れる。これらのノードは、ある時点で解放する必要があります。
          • 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()
      • device_node をループの反復処理から守ります。以下から戻るか、中断する場合は、ある時点で残りの参照を破棄する必要があります。
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • 前述の変更は、Linux 6.12-rc4 のリリース中に復元されました(aosp/3315251 を参照)。これにより CONFIG_OF_DYNAMIC が再度有効になり、欠陥のあるドライバが公開される可能性があります。