Skip to content

re.Pattern.match() matches and can read out of bounds when pos > endpos #160316

Closed

Description

@gpshead

Bug report

Bug description:

re.Pattern.match() (and prefixmatch(), fullmatch(), scanner().match()) run the matching engine when pos > endpos, although the docs say "If endpos is less than pos, no match will be found". Zero-width patterns then return an empty match, and a MULTILINE $ reads the character at pos, which is one past the end of the buffer when pos == len(string). search() already returns None here.

import mmap, re

print(re.compile("").match("abc", 3, 1))    # <re.Match object; span=(3, 3), match=''>
print(re.compile("").search("abc", 3, 1))   # None

mm = mmap.mmap(-1, 2 * mmap.PAGESIZE)
mm.resize(mmap.PAGESIZE)                    # leaves the next page unmapped
re.compile(rb"$", re.M).match(mm, mmap.PAGESIZE, 0)   # Segmentation fault

Expected None from every call. str and bytes subjects are NUL terminated so the read stays in bounds for them; mmap and array.array subjects are not.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs

Activity

  1. self-assigned this
    on Oct 22, 2026
  2. added a commit that references this issue on Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

extension-modulesC modules in the Modules dirtopic-regextype-crashA hard crash of the interpreter, possibly with a core dump

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions