-
Notifications
You must be signed in to change notification settings - Fork 574
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: Fix handling of large json data when writing to file via --json [CLI-73] #5093
Conversation
|
7e7da12
to
5f2f266
Compare
7bf94a5
to
9abc1df
Compare
731198a
to
e04c477
Compare
f77df62
to
53881c9
Compare
dd55604
to
1cae449
Compare
39189d4
to
1eed9a1
Compare
ed223ba
to
76b4fec
Compare
76b4fec
to
00ee949
Compare
3708473
to
8b3d9d8
Compare
8b3d9d8
to
ff65256
Compare
Pull Request Submission
Please check the boxes once done.
The pull request must:
feat:
orfix:
, others might be used in rare occasions as well, if there is no need to document the changes in the release notes. The changes or fixes should be described in detail in the commit message for the changelog & release notes.Pull Request Review
All pull requests must undergo a thorough review process before being merged.
The review process of the code PR should include code review, testing, and any necessary feedback or revisions.
Pull request reviews of functionality developed in other teams only review the given documentation and test reports.
Manual testing will not be performed by the reviewing team, and is the responsibility of the author of the PR.
For Node projects: It’s important to make sure changes in
package.json
are also affectingpackage-lock.json
correctly.If a dependency is not necessary, don’t add it.
When adding a new package as a dependency, make sure that the change is absolutely necessary. We would like to refrain from adding new dependencies when possible.
Documentation PRs in gitbook are reviewed by Snyk's content team. They will also advise on the best phrasing and structuring if needed.
Pull Request Approval
Once a pull request has been reviewed and all necessary revisions have been made, it is approved for merging into
the main codebase. The merging of the code PR is performed by the code owners, the merging of the documentation PR
by our content writers.
What does this PR do?
This PR fixes an error occurring when using
--json
when writing large JSON objects to stdout. The error surfaced as a exception with a stack trace similar to the one belowThe root cause is a size limitation of Nodejs V8 string size limit when converting objects to strings using
JSON.stringify
in json.ts.The solution introduced in this PR uses a streaming mechanism to work around this limitation.
In order to minimise risk, the new streaming implementation was successfully implemented for
--json-file-output
first #5007. Additionally, the streaming implementation is only used whenJSON.stringify
failstest
finds issues, if there are no issues the streaming implementation is not used as we know the size of the JSON output depends on finding vulnerabilitiesThe existing behaviour when
JSON.stringify
fails is to throw aRangeError
error, and occurs when using the--json
and--json-file-output
flags.For the above reasons, the risk is assumed to be LOW
Where should the reviewer start?
Looking at the acceptance test test --json handles responses larger than 512Mb string size limit in v8 to get an idea of what causes the issue.
How should this be manually tested?
It can be tested via building an edited local version of the CLI binary:
jsonPayload
here so that we trigger thejsonStreamify
option here to stream JSON rather than stringify itdebug
logs to validate that we're using thejsonStreamify
optionmake clean build
./binary-releases/<local-binary> container test <image:tag> --json -d
It can also be quickly tested by running the legacy CLI as the changes are there:
npx ts-node ./src/cli/index.ts container test <image:tag> --json -d
Manually testing the fix will be difficult without manipulating the JSON object in code, as it depends on the image having an extremely high number of issues. The acceptance test
test --json handles responses larger than 512Mb string size limit in v8
shows how to do this if desired.Any background context you want to provide?
What are the relevant tickets?
Screenshots
Additional questions