Title: `_set_str` missing `NULL` check after `PyUnicode_DecodeASCII` in `_csv.c` · Issue #146093 · python/cpython · GitHub
Open Graph Title: `_set_str` missing `NULL` check after `PyUnicode_DecodeASCII` in `_csv.c` · Issue #146093 · python/cpython
X Title: `_set_str` missing `NULL` check after `PyUnicode_DecodeASCII` in `_csv.c` · Issue #146093 · python/cpython
Description: Crash report What happened? It's possible to segfault the interpreter on OOM by trying to write a CSV row. Automated diagnosis: Bug: On OOM, PyUnicode_DecodeASCII returns NULL, _set_str stores NULL in *target and returns 0 (success). Lat...
Open Graph Description: Crash report What happened? It's possible to segfault the interpreter on OOM by trying to write a CSV row. Automated diagnosis: Bug: On OOM, PyUnicode_DecodeASCII returns NULL, _set_str stores NULL...
X Description: Crash report What happened? It's possible to segfault the interpreter on OOM by trying to write a CSV row. Automated diagnosis: Bug: On OOM, PyUnicode_DecodeASCII returns NULL, _set_str stores ...
Opengraph URL: https://github.com/python/cpython/issues/146093
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"`_set_str` missing `NULL` check after `PyUnicode_DecodeASCII` in `_csv.c`","articleBody":"# Crash report\n\n### What happened?\n\nIt's possible to segfault the interpreter on OOM by trying to write a CSV row.\n\n### Automated diagnosis:\n\nBug: On OOM, `PyUnicode_DecodeASCII` returns `NULL`, `_set_str` stores `NULL` in `*target` and returns 0 (success). Later `PyUnicode_GET_LENGTH(NULL)` segfaults.\n\nFile: Modules/_csv.c, line 319\n\nMRE:\n```python\nimport _testcapi, csv, io\n\n# Persistent failure ensures the allocation inside _set_str fails\nfor n in range(1, 30):\n print(n)\n _testcapi.set_nomemory(n, 0)\n try:\n w = csv.writer(io.StringIO())\n w.writerow([\"a\", \"b\"])\n _testcapi.remove_mem_hooks()\n break\n except MemoryError:\n _testcapi.remove_mem_hooks()\n```\n\nBacktrace:\n```\nProgram received signal SIGSEGV, Segmentation fault.\ndialect_check_char (name=0x7ffff7fa39e5 \"delimiter\", c=44, dialect=dialect@entry=0x7ffff74dadb0, allowspace=true) at ./Modules/_csv.c:353\n353 PyUnicode_GET_LENGTH(dialect-\u003elineterminator), 1) \u003e= 0)\n\n#0 dialect_check_char (name=0x7ffff7fa39e5 \"delimiter\", c=44, dialect=dialect@entry=0x7ffff74dadb0, allowspace=true) at ./Modules/_csv.c:353\n#1 0x00007ffff7f9ee52 in dialect_new (type=0x555555f539b0, args=0x555555d62c40 \u003c_PyRuntime+135440\u003e, kwargs=0x0) at ./Modules/_csv.c:543\n#2 0x000055555576bd44 in type_call (self=0x555555f539b0, args=\u003coptimized out\u003e, kwds=\u003coptimized out\u003e) at Objects/typeobject.c:2441\n#3 0x00005555556a34b4 in _PyObject_MakeTpCall (tstate=0x555555d99c08 \u003c_PyRuntime+360664\u003e, callable=0x555555f539b0, args=0x0, nargs=0, keywords=0x0) at Objects/call.c:242\n#4 0x00007ffff7fa19d3 in _call_dialect (module_state=0x7ffff72d4cc0, dialect_inst=0x0, kwargs=0x0) at ./Modules/_csv.c:646\n#5 csv_writer (module=0x7ffff72b47a0, args=0x7ffff7477cf0, keyword_args=0x0) at ./Modules/_csv.c:1581\n#6 0x00005555557210e2 in cfunction_call (func=0x7ffff72cf170, args=0x7ffff7477cf0, kwargs=0x0) at Objects/methodobject.c:564\n#7 0x00005555556a34b4 in _PyObject_MakeTpCall (tstate=0x555555d99c08 \u003c_PyRuntime+360664\u003e, callable=0x7ffff72cf170, args=0x7fffffffb628, nargs=1, keywords=0x0) at Objects/call.c:242\n#8 0x000055555583f29d in _Py_VectorCall_StackRefSteal (callable=callable@entry=..., arguments=0x7ffff7fa7090, total_args=total_args@entry=1, kwnames=kwnames@entry=...) at Python/ceval.c:733\n#9 0x00005555558556d6 in _PyEval_EvalFrameDefault (tstate=tstate@entry=0x555555d99c08 \u003c_PyRuntime+360664\u003e, frame=\u003coptimized out\u003e, frame@entry=0x7ffff7fa7020, throwflag=throwflag@entry=0)\n at Python/generated_cases.c.h:4170\n#10 0x000055555583f08b in _PyEval_EvalFrame (tstate=0x555555d99c08 \u003c_PyRuntime+360664\u003e, frame=0x7ffff7fa7020, throwflag=0) at ./Include/internal/pycore_ceval.h:118\n#11 _PyEval_Vector (tstate=tstate@entry=0x555555d99c08 \u003c_PyRuntime+360664\u003e, func=func@entry=0x7ffff7466690, locals=locals@entry=0x7ffff746a4b0, args=args@entry=0x0,\n argcount=argcount@entry=0, kwnames=kwnames@entry=0x0) at Python/ceval.c:2130\n#12 0x000055555583ee1e in PyEval_EvalCode (co=co@entry=0x555555f396d0, globals=globals@entry=0x7ffff746a4b0, locals=locals@entry=0x7ffff746a4b0) at Python/ceval.c:686\n#13 0x00005555559c8f8e in run_eval_code_obj (tstate=0x555555d99c08 \u003c_PyRuntime+360664\u003e, co=co@entry=0x555555f396d0, globals=globals@entry=0x7ffff746a4b0, locals=locals@entry=0x7ffff746a4b0)\n at Python/pythonrun.c:1368\n#14 0x00005555559c8adb in run_mod (mod=mod@entry=0x555555f40fa0, filename=filename@entry=0x7ffff74e8580, globals=globals@entry=0x7ffff746a4b0, locals=locals@entry=0x7ffff746a4b0,\n flags=0x7fffffffc950, arena=arena@entry=0x7ffff74dad40, interactive_src=0x0, generate_new_source=0) at Python/pythonrun.c:1471\n```\n\n\nFound using [cpython-review-toolkit](https://github.com/devdanzin/cpython-review-toolkit) with Claude Opus 4.6, using the `/cpython-review-toolkit:explore Modules/_csv.c all deep` command.\n\n\n\n### CPython versions tested on:\n\nCPython main branch\n\n### Operating systems tested on:\n\nLinux\n\n### Output from running 'python -VV' on the command line:\n\nPython 3.15.0a7+ (heads/main:e0f7c1097e1, Mar 17 2026, 18:10:52) [Clang 21.1.2 (2ubuntu6)]\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-146113\n* gh-146130\n* gh-146131\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/devdanzin","@type":"Person","name":"devdanzin"},"datePublished":"2026-03-17T23:41:13.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4},"url":"https://github.com/146093/cpython/issues/146093"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5ed18116-0e0e-3251-c877-7f5e4c0492d1 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | B55A:190031:98C14C:D30835:6A5131BD |
| html-safe-nonce | 34478d1ac54f3d799c69838b9cf149f78273b85ebfc62851c3229886edc575b1 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCNTVBOjE5MDAzMTo5OEMxNEM6RDMwODM1OjZBNTEzMUJEIiwidmlzaXRvcl9pZCI6IjE2MjM2ODE3MjE5NzAwMTI2MDUiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | bcf7ded568edde74db6b67c5a2b1a366433412cfd3556c99082e2fe06e59ac73 |
| hovercard-subject-tag | issue:4091798145 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/146093/issue_layout |
| twitter:image | https://opengraph.githubassets.com/4c29e56688b79ac797cde2a38f5784844f66ee310a8e3adf3e48b8198f6ffa7b/python/cpython/issues/146093 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/4c29e56688b79ac797cde2a38f5784844f66ee310a8e3adf3e48b8198f6ffa7b/python/cpython/issues/146093 |
| og:image:alt | Crash report What happened? It's possible to segfault the interpreter on OOM by trying to write a CSV row. Automated diagnosis: Bug: On OOM, PyUnicode_DecodeASCII returns NULL, _set_str stores NULL... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | devdanzin |
| hostname | github.com |
| expected-hostname | github.com |
| None | e840f405b2718e8f2d55aafa9ff27dbce17e29d0c253011d05ea0fea3c78baff |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 4ae6027e8ba70c79dc08249bb6cdc1a09d788496 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width