Return false in Reader::readValue when stack limit is exceeded (#1619)

jsoncpp, as a shared library, should not call `abort` merely because there's an error reading a value.

See https://en.cppreference.com/w/c/program/abort, `abort` should only be called to **abnormally** cause the program to exit. Functions inserted by `atexit` are also not called, meaning that the host program may have not cleaned up resources properly. But here, exceeding stack limit isn't a sign of abnormalty.

`exit` is not a good substitute either, see the `exit-in-shared-library` from Debian:
https://lintian.debian.org/tags/exit-in-shared-library.html

Fix #1618

In this case, returning false seems like a better idea.

Co-authored-by: Jordan Bayles <bayles.jordan@gmail.com>
This commit is contained in:
Hong Xu 2025-11-12 00:07:06 -08:00 committed by GitHub
parent 4bcbc6ac05
commit 30e7528001
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -144,7 +144,12 @@ bool Reader::readValue() {
// after calling readValue(). parse() executes one nodes_.push(), so > instead // after calling readValue(). parse() executes one nodes_.push(), so > instead
// of >=. // of >=.
if (nodes_.size() > stackLimit_g) if (nodes_.size() > stackLimit_g)
#if JSON_USE_EXCEPTION
throwRuntimeError("Exceeded stackLimit in readValue()."); throwRuntimeError("Exceeded stackLimit in readValue().");
#else
// throwRuntimeError aborts. Don't abort here.
return false;
#endif
Token token; Token token;
readTokenSkippingComments(token); readTokenSkippingComments(token);