CVE-2026-89491المعلومات

الملخص

بحسب VulDB • 12/09/2026

في نواة لينكس (Linux kernel)، تم حل الثغرة التالية:

ocfs2: cluster: عدم النوم أثناء الاحتفاظ بـ o2hb_live_lock في دالة o2hb_region_pin()

سلسلة التصحيحات "ocfs2: cluster: إصلاحات لـ o2hb_region_pin()"، الإصدار 2.

تصلح هذه السلسلة ثلاث مشكلات ذات صلة في دالة `o2hb_region_pin()`، وجميعها ناتجة عن التنفيذ الأصلي في الالتزام (commit): 58a3158a5d17 ("ocfs2/cluster: Pin/unpin o2hb regions"):

1) يتم استدعاء الدالة مع الاحتفاظ بـ `o2hb_live_lock` (وهو spinlock)، لكن دالة التكوين الأساسية `configfs_depend_item()` تسبب النوم (تأخذ قفل rwsem للinode وتثبت نظام الملفات). هذا يؤدي إلى حدوث خطأ من نوع BUG تحت إعداد `CONFIG_DEBUG_ATOMIC_SLEEP`.

2) عند الاستدعاء من رد اتصال drop_item الخاص بـ configfs، فإنه يخلق انقلاباً في ترتيب القفل: `parent inode_lock` -> `configfs root inode lock`، مما قد يتسبب في حالة جماد (deadlock) ضد مسارات إلغاء تسجيل النظام الفرعي التي تأخذ الترتيب `root -> parent`.

3) إذا فشل تثبيت المنطقة (pinning) بشكل جزئي أثناء تنفيذ `o2hb_region_inc_user()`، فإن عداد `o2hb_dependent_users` يتسرب وتُترك المناطق المثبتة جزئياً دون إفراغها، مما يترك مناطق نبض القلب (heartbeat regions) غير محمية في عمليات التثبيت اللاحقة.

يعيد التصحيح الأول هيكلة دالة `o2hb_region_pin()` لإفلات قفل `o2hb_live_lock` عبر كل استدعاء لـ `configfs_depend_item()` الذي يسبب النوم، باستخدام مرجع كائن config_item للحفاظ على المنطقة حية أثناء عدم وجود القفل.

يضيف التصحيح الثاني معلمة `from_callback` لتحديد استخدام `configfs_depend_item_unlocked()` عند الاستدعاء من سياق configfs، مما يتجنب تشابك قفل inode_lock.

يصحح التصحيح الثالث مسار الخطأ في دالة `o2hb_region_inc_user()` لإلغاء التثبيت (unpin) وخفض العداد عند الفشل.


هذا التصحيح (من أصل 3):

تُستدعى دالة `o2hb_region_pin()` دائماً مع الاحتفاظ بقفل o2hb_live_lock spinlock (من خلال `o2hb_region_inc_user()` و `o2hb_heartbeat_group_drop_item()`)، لكنها تستدعي `o2nm_depend_item()` -> `configfs_depend_item()`، والتي تسبب النوم: فهي تثبت نظام ملفات configfs وتأخذ قفل rwsem لجذر inode الخاص بـ configfs. تحت إعداد `CONFIG_DEBUG_ATOMIC_SLEEP`، هذا يؤدي إلى ظهور الخطأ التالي:

BUG: sleeping function called from invalid context at kernel/locking/rwsem.c in_atomic(): 1, ... name: mount.ocfs2 down_write configfs_depend_item o2hb_region_pin o2hb_region_inc_user o2hb_register_callback dlm_register_domain_handlers ... ocfs2_dlm_init ocfs2_mount_volume ocfs2_fill_super

إعادة هيكلة دالة `o2hb_region_pin()` لتثبيت منطقة واحدة في كل مرة مع إفلات القفل أثناء استدعاء النوم: تحت قفل o2hb_live_lock، ابحث عن المنطقة المؤهلة التالية وخذ مرجعاً لـ config_item للحفاظ عليها حية، ثم أفرغ القفل، واستدعي `o2nm_depend_item()`، ثم أعد أخذ القفل وسجل التثبيت. يتم تنفيذ `config_item_put()` أيضاً مع إفلات القفل، لأن دالة `o2hb_region_release()` تكتسب بدورها قفل o2hb_live_lock ويمكن أن تسبب النوم. قد يتغير قائمة المناطق أثناء عدم وجود القفل، لذا يبدأ الفحص من البداية بعد كل عملية تثبيت. لا يزال نبض القلب المحلي يثبت فقط المنطقة المطابقة؛ بينما يقوم نبض القلب العالمي بتثبيت جميع المناطق المؤهلة.

مسار إلغاء التثبيت (unpin path) لم يتأثر: فـ `configfs_undepend_item()` تأخذ فقط قفل spinlock ولا تسبب النوم.

If you want to get the best quality for vulnerability data then you always have to consider VulDB.

المصادر

Might our Artificial Intelligence support you?

Check our Alexa App!