Bản sửa lỗi GKI 16-6.12 android-mainline

Trang này mô tả các vấn đề quan trọng và bản sửa lỗi phát hiện thấy trên android-mainline mà có thể quan trọng với đối tác.

Ngày 1 tháng 11 năm 2024

  • Ra mắt Linux 6.12-rc4
    • Tóm tắt: CONFIG_OF_DYNAMIC có khả năng gây ra sự hồi quy nghiêm trọng cho người lái xe lỗi.
    • Thông tin chi tiết: Trong khi hợp nhất 6.12-rc1 của Linux vào android-mainline, chúng tôi nhận thấy các vấn đề về trình điều khiển ngoài cây không tải được. Thay đổi đã hiển thị lỗi trình điều khiển được xác định là thay đổi 274aff8711b2 ("clk: Add KUnit tests for clks registered with struct clk_parent_data") và chúng tôi tạm thời huỷ thay đổi đó trong aosp/3287735. Thay đổi này sẽ chọn CONFIG_OF_OVERLAY, sau đó chọn CONFIG_OF_DYNAMIC. Với !OF_DYNAMIC, tính năng đếm tham chiếu trên of_node_get()of_node_put() sẽ bị vô hiệu hoá hiệu quả khi được triển khai dưới dạng noops. Việc bật lại OF_DYNAMIC sẽ cho thấy các vấn đề trong trình điều khiển triển khai không chính xác tính năng đếm tham chiếu cho struct device_node. Điều này gây ra nhiều loại lỗi như hỏng bộ nhớ, use-after-free và rò rỉ bộ nhớ.
    • Tất cả các hoạt động sử dụng API liên quan đến việc phân tích cú pháp OF đều phải được kiểm tra. Danh sách sau đây chỉ là một phần, nhưng bao gồm các trường hợp mà chúng tôi đã quan sát được:
      • Sử dụng sau khi hết thời gian miễn phí (UAF):
        • Sử dụng lại cùng một đối số device_node: Các hàm đó gọi of_node_put() trên nút đã cho, có thể cần thêm of_node_get() trước khi gọi các hàm đó (ví dụ: khi gọi nhiều lần với cùng một nút làm đối số):
          • 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()
        • Sử dụng device_node sau bất kỳ loại thoát nào khỏi một số vòng lặp nhất định:
          • for_each_available_child_of_node_scoped()
          • for_each_available_child_of_node()
          • for_each_child_of_node_scoped()
          • for_each_child_of_node()
        • Giữ con trỏ trực tiếp đến các thuộc tính char * từ device_node, ví dụ: sử dụng:
          • const char *foo = struct device_node::name
          • of_property_read_string()
          • of_property_read_string_array()
          • of_property_read_string_index()
          • of_get_property()
      • Rò rỉ bộ nhớ:
        • Nhận một device_node và quên huỷ đăng ký (of_node_put()). Các nút được trả về từ những nút này cần được giải phóng tại một thời điểm nào đó:
          • 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()
      • Không cho lặp lại một device_node. Nếu bạn đang trả về hoặc bẻ từ bên trong phần sau, bạn cần bỏ tham chiếu còn lại tại một thời điểm nào đó:
        • for_each_available_child_of_node()
        • for_each_child_of_node()
        • for_each_node_by_type()
        • for_each_compatible_node()
        • of_for_each_phandle()
    • Thay đổi được đề cập trước đó đã được khôi phục trong khi hạ cánh Linux 6.12-rc4 (xem aosp/3315251) bật lại CONFIG_OF_DYNAMIC và có thể hiển thị trình điều khiển lỗi.