-
Notifications
You must be signed in to change notification settings - Fork 533
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-file-output [CLI-46] #5007
Conversation
|
802ca5d
to
622389a
Compare
@@ -44,6 +47,7 @@ import { SarifFileOutputEmptyError } from '../lib/errors/empty-sarif-output-erro | |||
import { InvalidDetectionDepthValue } from '../lib/errors/invalid-detection-depth-value'; | |||
import { obfuscateArgs } from '../lib/utils'; | |||
import { EXIT_CODES } from './exit-codes'; | |||
const isEmpty = require('lodash/isEmpty'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nitpick (non-blocking): Can we align on using imports rather than requires? Marking this as non-blocking as I ideally this is something picked up by tooling. Likely a bunch of other places across the code base this needs to be resolved.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is actually a linting rule specifically for lodash. Not sure why it's there, but didn't want to change it in this PR.
4b7b44d
to
daba888
Compare
b28d5a3
to
3621034
Compare
3621034
to
5448caf
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-file-output
when writing large JSON objects into the specified file. 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 is used only when:
JSON.stringify
fails in json.ts.--json-file-output
The existing behaviour when
JSON.stringify
fails is to throw aRangeError
error, and occurs when using the--json
and--json-file-output
flags.This PR should also provide a better error message, instead of throwing a
RangeError
, whenJSON.stringify
fails with the--json
flag.For the above reasons, the risk is assumed to be LOW
Where should the reviewer start?
Looking at the acceptance test test --json-file-ouput 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 a local version of the CLI binary:
make clean build
./binary-releases/<local-binary> container test --json-file-output=./output.json <image:tag>
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 --json-file-output=./output.json <image:tag>
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-file-ouput 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