{"id":"CVE-2026-98749","title":"tty: serial: max3100: shut down timer before freeing port","summary":"In the Linux kernel, the following vulnerability has been resolved:\n\ntty: serial: max3100: shut down timer before freeing port\n\nmax3100_shutdown() stops the polling timer but returns early during\nsystem suspend. If the SPI device is unbo…","severity":"none","vendor":"Linux","product":"Linux","affected":["Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < fb668620e3b163962dabe1a674725a07aa44ff4a","Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < 2c8614981d3e6e000427de0ab2426ab68274d850","Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < 247b8f680876313586aed4d267bfcceddc2b4901","Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < db0949bbd06db0a75b4b1076f1e25194be7d956a","Linux 2.6.30"],"published":"2026-10-18","updated":"2026-10-18","sourceUpdated":"2026-10-18T15:47:34.347Z","source":"CVEORG","sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-98749","references":[{"url":"https://git.kernel.org/stable/c/fb668620e3b163962dabe1a674725a07aa44ff4a"},{"url":"https://git.kernel.org/stable/c/2c8614981d3e6e000427de0ab2426ab68274d850"},{"url":"https://git.kernel.org/stable/c/247b8f680876313586aed4d267bfcceddc2b4901"},{"url":"https://git.kernel.org/stable/c/db0949bbd06db0a75b4b1076f1e25194be7d956a"}],"tags":["cve.org"],"ingestedAt":"2026-10-18T16:47:32.500Z","slug":"CVE-2026-98749","body":"## Overview\n\nIn the Linux kernel, the following vulnerability has been resolved:\n\ntty: serial: max3100: shut down timer before freeing port\n\nmax3100_shutdown() stops the polling timer but returns early during\nsystem suspend. If the SPI device is unbound before resume, the serial\ncore does not call max3100_shutdown() again, so max3100_remove() frees\nthe port while the timer remains armed. max3100_timeout() may then\naccess the freed port and re-arm the timer.\n\nAdd final timer teardown to max3100_remove() and use\ntimer_shutdown_sync() to prevent a racing callback from re-arming it.\nAlso free the IRQ and destroy the workqueue there before freeing the\nport. Keep timer_delete_sync() in max3100_shutdown() so that a\nsubsequent open() can re-arm the timer.\n\nThe workqueue is created before request_irq() and destroyed on both\nrequest_irq() failure and normal shutdown. Its presence at remove thus\nidentifies the IRQ left registered when suspend bypasses shutdown.\n\nFree the IRQ before destroying the workqueue, in both\nmax3100_shutdown() and max3100_remove(), and cancel the pending work\nin between. free_irq() waits for a running interrupt handler to\nfinish and no new handler can start afterwards, so a racing handler\ncannot queue work on a workqueue that is being destroyed; the\nforce_end_work check in max3100_dowork() only narrows that window, as\na handler delayed between the check and queue_work() could still run\nafter the teardown has cleared the workqueue pointer. Cancelling the\nwork also keeps destroy_workqueue() from waiting on a queued work item\nin case remove() ever runs while the freezable workqueue is still\nfrozen, e.g. device removal during the resume window, before\nworkqueues are thawed.\n\nThis issue was found by an in-house static analysis tool.\n\n## Affected\n\n- `Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < fb668620e3b163962dabe1a674725a07aa44ff4a`\n- `Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < 2c8614981d3e6e000427de0ab2426ab68274d850`\n- `Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < 247b8f680876313586aed4d267bfcceddc2b4901`\n- `Linux >= 7831d56b0a3544cbb6f82f76c34ca95e24d5b676 < db0949bbd06db0a75b4b1076f1e25194be7d956a`\n- `Linux 2.6.30`\n\n## Remediation\n\nRefer to the linked advisories for vendor-supplied fixes and affected version ranges.","depth":"sunlit","depthScore":3,"depthScoreParts":{"impact":2.8,"likelihood":0,"exploitation":0,"ransomware":0},"changes":[]}