本頁將說明 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()
- 釋放後使用 (UAF):
- 在安裝 Linux
6.12-rc4
時 (請參閱 aosp/3315251),系統會還原先前提到的變更,再次啟用CONFIG_OF_DYNAMIC
,並可能會公開有問題的驅動程式。
- 摘要: