Description
I encountered a MemoryError: Parser stack overflowed - Python source too complex to parse when attempting to run the Flask 3.1 with Python 3.14 and SQLite3 example (flask3.1-python3.14-sqlite3-base) from the catalog on the QEMU x86_64 platform. The application starts successfully, but crashes when attempting to render Jinja2 templates.
Note: The Flask 3.1 with Python 3.14 example without SQLite3 (flask3.1-python3.14-base) works correctly. This issue is specific to the SQLite3 version which uses Jinja2 templates.
The issue can be reproduced by using the following exact commands:
cd examples/flask3.1-python3.14-sqlite3-base
kraft build
kraft run --rm -p 8080:8080 --plat qemu --arch x86_64 -M 1024M .
Then, in another terminal:
The application crashes with the following error:
Exception occurred during processing of request from ('10.0.2.2', 48602)
Traceback (most recent call last):
File "/usr/local/lib/python3.14/site-packages/jinja2/lexer.py", line 654, in wrap
.decode("unicode-escape")
~~~~~~^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/encodings/__init__.py", line 99, in search_function
mod = __import__('encodings.' + modname, fromlist=_import_tail,
level=0)
MemoryError: Parser stack overflowed - Python source too complex to parse
Root Cause Analysis
The issue appears to be related to Python 3.14's new stack protection mechanisms being incompatible with Unikraft's elfloader stack switching. When Jinja2 attempts to parse templates, Python 3.14's stack overflow detection triggers, causing the parser to fail even though there is sufficient stack space allocated.
Attempted Solutions
-
Increased stack size: Modified Kraftfile to set CONFIG_APPELFLOADER_STACK_NBPAGES from 128 (512KB) to 1024 (4MB), but the error persists.
-
Disabled stack checks: Added CONFIG_LIBPOSIX_ENVIRON_ENVP4: "PYTHONNOSTACKCHECK=1" to disable Python 3.14's stack overflow checks, but the error still occurs.
-
Increased memory: Used -M 1024M flag in kraft run, but this only affects total memory, not stack size.
Observations
- The Flask 3.1 with Python 3.14 example without SQLite3 (
flask3.1-python3.14-base) works correctly and does not exhibit this issue.
- The same Flask application with Python 3.12 works correctly with SQLite3 and Jinja2 templates (
flask3.0-python3.12-sqlite3-base).
- The issue is specific to the SQLite3 version (
flask3.1-python3.14-sqlite3-base) which uses Jinja2 templates.
- The problem manifests when Jinja2 attempts to parse templates, triggering Python 3.14's stack overflow detection on Unikraft.
Environment Information
- Operating System (Host): Linux (WSL2)
- Target Platform: QEMU/x86_64
- Failing Example:
examples/flask3.1-python3.14-sqlite3-base
- Python Version: 3.14
- Flask Version: 3.1
- KraftKit Version: 0.12.5
Description
I encountered a
MemoryError: Parser stack overflowed - Python source too complex to parsewhen attempting to run the Flask 3.1 with Python 3.14 and SQLite3 example (flask3.1-python3.14-sqlite3-base) from the catalog on the QEMU x86_64 platform. The application starts successfully, but crashes when attempting to render Jinja2 templates.Note: The Flask 3.1 with Python 3.14 example without SQLite3 (
flask3.1-python3.14-base) works correctly. This issue is specific to the SQLite3 version which uses Jinja2 templates.The issue can be reproduced by using the following exact commands:
Then, in another terminal:
The application crashes with the following error:
Root Cause Analysis
The issue appears to be related to Python 3.14's new stack protection mechanisms being incompatible with Unikraft's elfloader stack switching. When Jinja2 attempts to parse templates, Python 3.14's stack overflow detection triggers, causing the parser to fail even though there is sufficient stack space allocated.
Attempted Solutions
Increased stack size: Modified
Kraftfileto setCONFIG_APPELFLOADER_STACK_NBPAGESfrom 128 (512KB) to 1024 (4MB), but the error persists.Disabled stack checks: Added
CONFIG_LIBPOSIX_ENVIRON_ENVP4: "PYTHONNOSTACKCHECK=1"to disable Python 3.14's stack overflow checks, but the error still occurs.Increased memory: Used
-M 1024Mflag inkraft run, but this only affects total memory, not stack size.Observations
flask3.1-python3.14-base) works correctly and does not exhibit this issue.flask3.0-python3.12-sqlite3-base).flask3.1-python3.14-sqlite3-base) which uses Jinja2 templates.Environment Information
examples/flask3.1-python3.14-sqlite3-base