fix(NODE-6878): ensure documents are cleared correctly to handle emptyGe… #4488
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.
Jira issue: https://jira.mongodb.org/browse/NODE-6878
MongoDB Driver:
documents?.clear() is not a function
error in AbstractCursor.rewind()Issue Description
When using the MongoDB Node.js driver, there's an issue in the
rewind()
method ofAbstractCursor
. The method attempts to callthis.documents?.clear()
without checking if theclear()
method exists on thedocuments
object.In certain scenarios, particularly when the MongoDB driver uses an optimization called
emptyGetMore
to avoid unnecessary server calls,this.documents
is set to a simplified object literal that lacks theclear()
method:This causes an error when
rewind()
is called on cursors that have this optimization applied:Impact
This issue can cause applications to crash when:
rewind()
emptyGetMore
Reproduction Details
In this repository, the
reproduction.js
script demonstrates this issue by:Running the Reproduction
Expected output will show the error:
Proposed Solution
The issue can be fixed by modifying the
rewind()
method to safely handle cases wheredocuments
doesn't have aclear()
method. Here's the proposed fix:Why This Solution Works
clear()
exists before calling itdocuments
tonull
achieves the same goal asclear()
- it resets the cursor's document bufferemptyGetMore
cursorsReferences