GKI 16-6.12 android-mainline errata

本頁將說明 android-mainline 中可能對合作夥伴造成影響的重要問題和錯誤修正內容。

2024 年 11 月 1 日

  • Linux 6.12-rc4 發布資訊
    • 摘要:CONFIG_OF_DYNAMIC 可能會導致有瑕疵的驅動程式嚴重回歸。
    • 詳細資料:在將 Linux 6.12-rc1 合併至 android-mainline 時,我們發現無法載入樹外驅動程式的問題。揭露驅動程式錯誤的變更屬於修訂版本 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data"),因此我們暫時在 aosp/3287735 中還原了變更。變更會選取 CONFIG_OF_OVERLAY,而 CONFIG_OF_OVERLAY 會選取 CONFIG_OF_DYNAMIC。使用 !OF_DYNAMIC 時,of_node_get()of_node_put() 的重新計算功能會做為 noops 實作,因此會有效停用。再次啟用 OF_DYNAMIC 會再次顯示驅動程式錯誤實作 struct device_node 參照計數的問題。這會導致各種錯誤,例如記憶體損毀、使用已釋放記憶體和記憶體流失。
    • 所有使用 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,並可能會公開有問題的驅動程式。