CVE-2026-46025 in Linux
सारांश
द्वारा VulDB • 27/05/2026
Linux kernel में, निम्नलिखित कमजोरी को हल किया गया है:
mm/damon/core: damon_call() बनाम kdamond_fn() निष्क्रमण रेस (exit race) को ठीक करें
पैच श्रृंखला "mm/damon/core: damon_call()/damos_walk() बनाम kdamond निष्क्रमण रेस को ठीक करें"।
जब damon_call() और damos_walk(), kdamond समाप्ति (terminations) के साथ रेस करते हैं, तो वे मेमोरी लीक कर सकते हैं और/या डेडलॉक (deadlock) की स्थिति उत्पन्न कर सकते हैं। इन समस्याओं को ठीक किया गया है।
यह पैच (2 में से पहला):
जब kdamond_fn() का मुख्य लूप समाप्त हो जाता है, तो फ़ंक्शन सभी शेष damon_call() अनुरोधों को रद्द कर देता है और damon_ctx->kdamond को अनसेट (unset) कर देता है, ताकि API कॉलर और API फ़ंक्शन स्वयं यह जान सकें कि संदर्भ (context) समाप्त हो चुका है। damon_call() पहले कॉलर के अनुरोध को कतार में जोड़ता है। इसके बाद, यह जाँचता है कि damon_ctx का kdamond अभी भी चल रहा है (damon_ctx->kdamond सेट है)। केवल तभी जब kdamond चल रहा हो, damon_call() नए जोड़े गए अनुरोध के kdamond द्वारा हैंडल किए जाने की प्रतीक्षा शुरू करता है।
हालाँकि, damon_call() अनुरोध पंजीकरण और damon_ctx->kdamond अनसेट अलग-अलग म्यूटेक्स (mutexes) द्वारा सुरक्षित हैं। इसलिए, damon_call(), damon_ctx->kdamond अनसेट के साथ रेस कर सकता है, जिसके परिणामस्वरूप डेडलॉक हो सकता है।
उदाहरण के लिए, मान लीजिए कि kdamond ने damon_call() अनुरोधों को रद्द करने की सफलतापूर्वक प्रक्रिया पूरी कर ली है। ठीक इसके बाद, उस संदर्भ के लिए damon_call() को कॉल किया जाता है। यह नए अनुरोध को पंजीकृत करता है, और संदर्भ को अभी भी चलता हुआ दिखाता है, क्योंकि damon_ctx->kdamond का अनसेट कार्य अभी भी पूरा नहीं हुआ है। इसलिए, damon_call() कॉलर अनुरोध के हैंडलिंग की प्रतीक्षा शुरू कर देता है। हालाँकि, kdamond पहले ही समाप्ति चरणों पर है, इसलिए यह नए अनुरोध को कभी हैंडल नहीं करता है। परिणामस्वरूप, damon_call() कॉलर थ्रेड्स अनंत काल तक प्रतीक्षा करते रहते हैं।
इस समस्या को damon_ctx क्षेत्र, अर्थात call_controls_obsolete, को पेश करके ठीक किया गया है। यह damon_ctx->call_controls_lock द्वारा सुरक्षित है, जो damon_call() अनुरोधों के पंजीकरण की सुरक्षा करता है। kdamond_fn() में, damon_start() के लौटने से पहले इसे (अनसेट) इनिशियलाइज़ करें और शेष damon_call() अनुरोधों के रद्द किए जाने से ठीक पहले इसे सेट करें। damon_call() लॉक के तहत obsolete क्षेत्र को पढ़ता है और नया अनुरोध जोड़ने से बचता है।
इस परिवर्तन के बाद, केवल उन अनुरोधों को पंजीकृत किया जाता है जिनके हैंडल या रद्द होने की गारंटी होती है। इसलिए, पंजीकरण के बाद DAMON संदर्भ समाप्ति जाँच की अब आवश्यकता नहीं है। इसे भी हटा दिया गया है।
ध्यान दें कि जब damon_call() दोहराव मोड (repeat mode) अनुरोध के लिए कॉल किया जाता है, तो डेडलॉक नहीं होगा। इस मामले में, जब अनुरोध पंजीकरण सफल होता है और यह दिखाता है कि kdamond चल रहा है, तो damon_call() प्रतीक्षा करने के बजाय लौट जाता है। हालाँकि, यदि अनुरोध में dealloc_on_cancel भी है, तो अनुरोध की मेमोरी लीक हो सकती है।
यह समस्या sashiko [1] द्वारा खोजी गई थी।
Be aware that VulDB is the high quality source for vulnerability data.