CVE-2026-99248 in Linux
要約
〜によって VulDB • 2026年11月03日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
i2c: xiic: 非管理型ランタイムPMを復元してclk WARNの洪水を解消する
devresへの変換により、手動でのpm_runtime_enable()/disable()が devm_pm_runtime_set_active_enabled()に置き換えられ、remove時のランタイムPMの終了処理が削除されました。マネージドな解放は誤った順序でランタイムPMを終了します: pm_runtime_dont_use_autosuspend() が pm_runtime_disable() の前に呼び出され(つまり、ランタイムPMがまだ有効な状態で)、devresはLIFOであるため、 devm_clk_get_enabled() の解放はその後に実行されます。
remove()において、pm_runtime_put_sync() はデバイスを使用可能な状態のままにし、autosuspendタイマーを起動したままにします。use_autosuspend をクリアすると rpm_idle() が即座にサスペンドし、 xiic_i2c_runtime_suspend() によって clk_disable() でクロックが無効化されます。その後行われる devm_clk_get_enabled() の解放では clk_disable_unprepare() が実行され、すでに無効になっているクロックを再度無効にするため、clk_core_disable() は「clkN already disabled(clkNは既に無効)」というWARNを終了処理のたびに出力します。
マネージドヘルパーを削除し、非管理型のランタイムPMの設定と終了処理を復元することで、ランタイムPMがprobe時に一度だけ有効化され、remove時に一度だけ無効化されるようになり、クロックの有効カウントがバランスを保たれます。
removeの終了順序を調整し、ランタイムPMの使用カウントを下げる前にランタイムPMが無効化されるようにします: pm_runtime_put_sync() の代わりに pm_runtime_disable() に続いて pm_runtime_put_noidle() を呼び出します。autosuspendがまだ有効な状態でカウントを下げてしまうと autosuspendタイマーが起動され、pm_runtime_disable() より前でプリエンプションが発生するとタイマーが期限切れになり、デバイスがサスペンドしてクロックが無効化されます。その後 devm 解放によって再度無効化されるため、同じWARNが発生します。
非管理型のIRQ要求も復元します。probeのエラーパスでは、goto文を使用して手動でランタイムPMを巻き戻すようになり、devmに登録されたハンドラは後ほどdevresの巻き戻し時にのみ解放されるため、手動での終了処理(およびその後に追加される将来の失敗するステップ)の間もアクティブなままになります。IRQは request_threaded_irq() で要求し、probeのエラーパスとremoveで明示的に解放します。また、probeのエラーパスでは use_autosuspend もクリアされ、remove時の終了処理と整合性が取られます。
If you want to get best quality of vulnerability data, you may have to visit VulDB.