Skip to content

Bug: Race condition in completeSegment ($RS) causes "Cannot read properties of null (reading 'parentNode')" error #35056

@ponharu

Description

@ponharu

The $RS (completeSegment) function in React DOM's Server-Side Rendering lacks null safety checks on parentNode, causing a race condition error when Suspense boundaries resolve in production builds.

Error:
Cannot read properties of null (reading 'parentNode')

Root Cause:
File: packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js (line 15)

The completeSegment function doesn't check if a.parentNode or b.parentNode is null before accessing it. During Suspense resolution, nodes can be removed by other processes, setting parentNode to null.

Buggy Code:
https://github.com/facebook/react/blob/v19.2.0/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js#L15

export const completeSegment =
  '$RS=function(a,b){a=document.getElementById(a);b=document.getElementById(b);for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)};';

Proposed Fix:

export const completeSegment =
  '$RS=function(a,b){a=document.getElementById(a);b=document.getElementById(b);if(a&&b&&a.parentNode&&b.parentNode){for(a.parentNode.removeChild(a);a.firstChild;)b.parentNode.insertBefore(a.firstChild,b);b.parentNode.removeChild(b)}};';

React version: 19.2.0

Steps To Reproduce

  1. Clone the reproduction repository
  2. Run npm install
  3. Run npm run build (production build required)
  4. Run npm run start
  5. Navigate to http://localhost:3000
  6. Note: The bug may not occur on the first page load. Reload the page several times if needed.
  7. Check browser console for the error

Link to code example:

https://github.com/ponharu/react-issue

The current behavior

During SSR with Suspense boundaries in production builds, the $RS function throws:
Cannot read properties of null (reading 'parentNode')

This occurs when the function attempts to manipulate DOM nodes whose parentNode has become null due to a race condition during Suspense resolution.

The expected behavior

The $RS function should safely handle cases where parentNode is null by checking for null before attempting DOM manipulation, preventing the error and allowing the page to render correctly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Status: UnconfirmedA potential issue that we haven't yet confirmed as a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions