{
  "affected": [
    {
      "ranges": [
        {
          "events": [
            {
              "introduced": "7831d56b0a3544cbb6f82f76c34ca95e24d5b676"
            },
            {
              "fixed": "fb668620e3b163962dabe1a674725a07aa44ff4a"
            },
            {
              "fixed": "2c8614981d3e6e000427de0ab2426ab68274d850"
            },
            {
              "fixed": "247b8f680876313586aed4d267bfcceddc2b4901"
            },
            {
              "fixed": "db0949bbd06db0a75b4b1076f1e25194be7d956a"
            }
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "type": "GIT"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "Linux",
        "name": "Kernel"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "2.6.30"
            },
            {
              "fixed": "6.12.113"
            }
          ],
          "type": "ECOSYSTEM"
        },
        {
          "events": [
            {
              "introduced": "6.13.0"
            },
            {
              "fixed": "6.18.56"
            }
          ],
          "type": "ECOSYSTEM"
        },
        {
          "events": [
            {
              "introduced": "6.19.0"
            },
            {
              "fixed": "7.2.10"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "database_specific": {
    "cna_assigner": "Linux",
    "osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/98xxx/CVE-2026-98749.json"
  },
  "details": "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 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.",
  "id": "CVE-2026-98749",
  "modified": "2026-10-19T02:30:17.000461999Z",
  "published": "2026-10-18T15:47:34.347Z",
  "references": [
    {
      "type": "PACKAGE",
      "url": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/247b8f680876313586aed4d267bfcceddc2b4901"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/2c8614981d3e6e000427de0ab2426ab68274d850"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/db0949bbd06db0a75b4b1076f1e25194be7d956a"
    },
    {
      "type": "WEB",
      "url": "https://git.kernel.org/stable/c/fb668620e3b163962dabe1a674725a07aa44ff4a"
    },
    {
      "type": "ADVISORY",
      "url": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/98xxx/CVE-2026-98749.json"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-98749"
    }
  ],
  "schema_version": "1.9.0",
  "summary": "tty: serial: max3100: shut down timer before freeing port"
}