GKI 16-6.12 android-mainline errata

หน้านี้อธิบายปัญหาสำคัญและการแก้ไขข้อบกพร่องที่พบใน android-mainline ซึ่งอาจสำคัญต่อพาร์ทเนอร์

1 พฤศจิกายน 2024

  • หน้า Landing Page ของ 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_DYNAMIC เมื่อใช้ !OF_DYNAMIC ระบบจะปิดใช้การนับการอ้างอิงใน of_node_get() และ of_node_put() อย่างมีประสิทธิภาพ เนื่องจากมีการใช้งานเป็น noops การเปิดใช้ OF_DYNAMIC อีกครั้งอาจก่อให้เกิดปัญหาในไดรเวอร์ที่ใช้การนับการอ้างอิงสำหรับ struct device_node อย่างไม่ถูกต้อง ซึ่งทำให้เกิดข้อผิดพลาดหลายประเภท เช่น หน่วยความจำเสียหาย การใช้งานหลังการใช้งานฟรี และหน่วยความจำรั่วไหล
    • การใช้ API ทั้งหมดที่เกี่ยวข้องกับการแยกวิเคราะห์ OF ต้องได้รับการตรวจสอบ รายการต่อไปนี้เป็นเพียงตัวอย่างบางส่วนของกรณีที่เราสังเกตได้
      • ใช้หลังข้อเสนอฟรี (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()
        • การเก็บเคอร์เซอร์โดยตรงไปยังพร็อพเพอร์ตี้ char * จาก device_node ไว้ เช่น ใช้สิ่งต่อไปนี้
          • 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 อีกครั้งและอาจทำให้ไดรเวอร์ทำงานผิดพลาด