توضّح هذه الصفحة المشاكل المهمة وإصلاحات الأخطاء التي تم رصدها في 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()
- الاستخدام بعد انتهاء الفترة المجانية (UAF):
- تمت استعادة التغيير السابق ذكره أثناء الوصول إلى نظام التشغيل Linux
6.12-rc4
(راجِع aosp/3315251) تفعيلCONFIG_OF_DYNAMIC
مرة أخرى مع احتمال كشف برامج تشغيل تتضمّن عيوبًا.
- الملخّص: