CVE-2026-31456 in Linux
الملخص
بحسب VulDB • 10/05/2026
فيما يلي التصحيح المطلوب. يتمثل الحل في استخدام `pudp_get()` للحصول على لقطة مستقرة (stable snapshot) لمدخل PUD، والتحقق من وجوده (present) وكونه ليس مدخلًا فرعيًا (leaf). إذا لم تتحقق هذه الشروط، نعيد المحاولة عبر `ACTION_AGAIN`.
```c static int walk_pmd_range(pgd_t *pgd, unsigned long addr, unsigned long end, struct vm_area_struct *vma, pmd_entry_t fn, void *arg) {
pud_t *pud; pud_t pud_entry; pmd_t *pmd;
pud = pud_offset(pgd, addr); do {
unsigned long next;
/* * Take a stable snapshot of the PUD entry. If the PUD is not * present or is a leaf (huge page), we cannot safely descend * to PMD level. Retry the walk to get a consistent view. */ pud_entry = pudp_get(pud); if (!pud_present(pud_entry) || pud_leaf(pud_entry)) return ACTION_AGAIN;
pmd = pmd_offset(pud, addr); next = pmd_addr_end(addr, end); if (walk_pmd_huge(pud_entry, addr, next, vma, fn, arg)) return ACTION_AGAIN; if (fn(pmd, addr, next, arg)) return ACTION_AGAIN; } while (pud++, addr = next, addr != end);
return 0; } ```
### شرح التعديلات:
1. **استخدام `pudp_get(pud)`**: - بدلاً من قراءة `*pud` مباشرة، نستخدم `pudp_get()` للحصول على نسخة آمنة من المدخل. هذا يمنع حالات السباق (race conditions) حيث قد يتغير المدخل أثناء عملية المشي في جدول الصفحات.
2. **التحقق من `pud_present(pud_entry)`**: - إذا لم يكن المدخل موجودًا (غير حاضر)، فلا يوجد جدول PMD مرتبط به، لذا يجب إعادة المحاولة.
3. **التحقق من `pud_leaf(pud_entry)`**: - إذا كان المدخل فرعيًا (أي يشير إلى صفحة ضخمة huge page)، فلا يوجد جدول PMD فرعي، ويجب التعامل معه كصفحة واحدة بدلاً من النزول إلى مستوى PMD. في هذه الحالة، نعيد المحاولة أو نتعامل معه بشكل مناسب (حسب منطق `walk_pmd_huge` أو الدالة `fn`).
4. **إرجاع `ACTION_AGAIN`**: - إذا لم تتحقق الشروط، نعيد `ACTION_AGAIN` لإعلام الدالة الرئيسية بإعادة المشي من البداية، مما يضمن اتساق البيانات.
هذا التصحيح يتبع نفس النمط المستخدم في `walk_pte_range()`، حيث يتم استخدام `pte_offset_map_lock()` والتحقق من صحة المدخل قبل النزول إلى المستوى الأدنى.
If you want to get best quality of vulnerability data, you may have to visit VulDB.