소스 검색

Route calloc through PyObject_Calloc in C tokenizer (#356, fixes #352)

pull/359/head
Aleksandr Kovalko 5 달 전
committed by GitHub
부모
커밋
d0bc82e97f
No known key found for this signature in database GPG 키 ID: B5690EEEBB952194
2개의 변경된 파일과 32개의 추가작업 그리고 0개의 파일을 삭제
  1. +1
    -0
      src/mwparserfromhell/parser/ctokenizer/common.h
  2. +31
    -0
      tests/test_tokenizer.py

+ 1
- 0
src/mwparserfromhell/parser/ctokenizer/common.h 파일 보기

@@ -39,6 +39,7 @@ SOFTWARE.
#endif

#define malloc PyObject_Malloc // XXX: yuck
#define calloc PyObject_Calloc
#define realloc PyObject_Realloc
#define free PyObject_Free



+ 31
- 0
tests/test_tokenizer.py 파일 보기

@@ -21,6 +21,9 @@
from __future__ import annotations

import os
import subprocess
import sys
import textwrap
from collections.abc import Generator
from dataclasses import dataclass

@@ -145,3 +148,31 @@ def test_describe_context():
assert "" == contexts.describe(0)
ctx = contexts.describe(contexts.TEMPLATE_PARAM_KEY | contexts.HAS_TEXT)
assert "TEMPLATE_PARAM_KEY|HAS_TEXT" == ctx


@pytest.mark.skipif(CTokenizer is None, reason="CTokenizer not available")
def test_entity_does_not_corrupt_heap():
"""Regression test: the C tokenizer must not mix raw libc calloc with
PyObject_Free when handling an ampersand that is not a valid entity.

Run in a subprocess with PYTHONMALLOC=debug so any allocator mismatch on
the entity-parsing path is reported as a fatal error rather than silent
heap corruption.
"""
program = textwrap.dedent(
"""
import mwparserfromhell
from mwparserfromhell.parser._tokenizer import CTokenizer
assert isinstance(mwparserfromhell.parser.Parser()._tokenizer, CTokenizer)
for text in ("a & b", "{{T|p=a & b}}", "&", "*", "*"):
assert str(mwparserfromhell.parse(text)) == text
"""
)
env = {**os.environ, "PYTHONMALLOC": "debug"}
result = subprocess.run(
[sys.executable, "-c", program], env=env, capture_output=True, text=True
)
assert result.returncode == 0, (
"C tokenizer triggered allocator mismatch under PYTHONMALLOC=debug:\n"
f"stdout:\n{result.stdout}\nstderr:\n{result.stderr}"
)

불러오는 중...
취소
저장