GKI 16-6.12 android-mainline 오류 수정사항

이 페이지에서는 android-mainline에서 발견되었으며 파트너에게 중요한 수정사항과 버그 수정을 설명합니다.

2024년 11월 1일

  • Linux 6.12-rc4 방문 페이지
    • 요약: CONFIG_OF_DYNAMIC가 결함이 있는 드라이버의 심각한 회귀를 일으킬 수 있습니다.
    • 세부정보: Linux 6.12-rc1android-mainline에 병합하는 동안 트리 외부 드라이버가 로드되지 않는 문제가 발견되었습니다. 드라이버 버그를 노출한 변경사항은 커밋 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data")로 식별되었으며 aosp/3287735에서 일시적으로 되돌렸습니다. 변경사항으로 인해 CONFIG_OF_OVERLAY이 선택되고 CONFIG_OF_DYNAMIC이 선택됩니다. !OF_DYNAMIC를 사용하면 of_node_get()of_node_put()noops로 구현되므로 참조 수가 효과적으로 사용 중지됩니다. OF_DYNAMIC를 다시 사용 설정하면 struct device_node의 참조 수를 잘못 구현하는 드라이버의 문제가 노출됩니다. 이로 인해 메모리 손상, use-after-free, 메모리 누수와 같은 다양한 유형의 오류가 발생합니다.
    • OF 파싱 관련 API의 모든 사용은 검사해야 합니다. 다음 목록은 일부이지만 지금까지 관찰된 사례를 포함합니다.
      • Use after free(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_nodechar * 속성에 대한 직접 포인터를 유지합니다.
          • 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를 다시 사용 설정하여 결함이 있는 드라이버를 노출시킬 수 있습니다.