GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Fix a leak in RawJSON() when the argument is rejected by espressolee · Pull Request #239 · python-rapidjson/python-rapidjson

Conversation

@espressolee

@espressolee espressolee commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

RawJSON(value) leaks one object every time the argument is rejected: RawJSON_new calls tp_alloc before PyArg_ParseTupleAndKeywords, and the failure branch returns NULL without releasing it. The result of tp_alloc was also never checked.

This reorders the constructor to parse first and allocate second, matching decoder_new / encoder_new / validator_new, and adds a tracemalloc test next to the existing ones in test_memory_leaks.py. On CPython 3.12.13, 100,000 rejected calls increased sys.getallocatedblocks() by 100,001 before this change and by 1 after; the 1.23 source I measured has the same RawJSON_new as master.

Also fixes the stub, where RawJSON.value was typed as RawJSON instead of str. That hunk is independent; drop it if you would rather not have it here.

Assisted-by: Claude Code:claude-fable-5-1

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@espressolee @claude
Fix a leak in RawJSON() when the argument is rejected
123396b
RawJSON_new allocated the object before parsing its argument and
returned NULL without releasing it when the "U" check failed, so every
RawJSON(<non-str>) leaked one object. Parse first and allocate second,
as the other constructors in this file do, and check tp_alloc's result.
Add a tracemalloc test in the shape of the existing ones: 1000 rejected
calls leave 1001 extra allocations before this change and 0 after.

Also fix the stub: RawJSON.value is the str that was passed, not a
RawJSON.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
@lelit

lelit commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Thank you, will merge before next release.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@lelit
lelit merged commit cb14886 into python-rapidjson:master Sep 5, 2026
9 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@lelit

lelit commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Merged in just released v1.24.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@espressolee @lelit
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.