الخطأ GKI 16-6.12 في الخطأ الرئيسي في Android

توضّح هذه الصفحة المشاكل المهمة وإصلاحات الأخطاء التي تم رصدها في android-mainline والتي قد تكون مهمة للشركاء.

1 تشرين الثاني (نوفمبر) 2024

  • الإصدار العلني من 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. ويؤدي ذلك إلى حدوث أنواع مختلفة من الأخطاء، مثل فساد الذاكرة واستخدام الذاكرة بعد تفريغها وتسرّب الذاكرة.
    • يجب فحص جميع استخدامات واجهات برمجة التطبيقات ذات الصلة بتحليل 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 مرة أخرى مع احتمال كشف برامج تشغيل تتضمّن عيوبًا.