Repository navigation
REST API: Avoid infinite recursion when a post is its own parent - #13924
jorgefilipecosta wants to merge 1 commit into
Conversation
`WP_REST_Posts_Controller::check_read_permission()` checks the parent of an `inherit` post. When the post was its own parent, the check called itself until PHP ran out of memory, for anyone who cannot read the post directly, including logged-out visitors. A self-parented post is now treated like one without a parent, as `get_post_status()` does.
Test using WordPress PlaygroundThe changes in this pull request can previewed and tested using a WordPress Playground instance. WordPress Playground is an experimental project that creates a full WordPress instance entirely within the browser. Some things to be aware of
For more details about these limitations and more, check out the Limitations page in the WordPress Playground documentation. |
|
The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. Core Committers: Use this line as a base for the props when committing in SVN: To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook. Props Bot commandsYou can trigger Props Bot actions by commenting on this PR:
|
WP_REST_Posts_Controller::check_read_permission()checks the parent of aninheritpost. When a post is its own parent, the check calls itself until PHP runs out of memory. It reaches that branch for anyone who can't read the post directly, including logged-out visitors, so one self-parented attachment makesGET /wp/v2/media/<id>, and everyGET /wp/v2/mediapage that lists it, end in a fatal error.wp_insert_post()refuses to make a post its own parent, but imports and direct database writes can leave one, andget_post_status()andget_post_ancestors()already handle it. This skips the parent check for a self-parented post, so it falls through to the existing branch for posts without a parent and is treated as published, asget_post_status()does. Longer parent loops aren't covered, the same as inget_post_status().Testing Instructions
wp db query "UPDATE wp_posts SET post_parent = ID WHERE ID = <id>", thenwp cache flush./wp-json/wp/v2/media/<id>and/wp-json/wp/v2/media.The new
test_get_item_inherit_status_with_self_parentgets the PHPUnit process killed on trunk and passes here.Trac ticket:
Use of AI Tools
This Pull Request is for code review only. Please keep all other discussion in the Trac ticket. Do not merge this Pull Request. See GitHub Pull Requests for Code Review in the Core Handbook for more details.