From 4618710f1f009fbef347dcc9eb636eb05314aee1 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Sun, 11 Oct 2026 09:02:53 +0200 Subject: [PATCH] Check the CSV file and the round count in the json_view benchmarks fopen() of the CSV output was not checked, so an unwritable directory made fprintf() write to a null FILE*; the round count is parsed with strtol and clamped instead of atoi. Signed-off-by: Niels Lohmann --- tests/benchmarks/json_view/bench_corpus.cpp | 8 +++++++- tests/benchmarks/json_view/bench_edit.cpp | 8 +++++++- tests/benchmarks/json_view/bench_view.cpp | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/tests/benchmarks/json_view/bench_corpus.cpp b/tests/benchmarks/json_view/bench_corpus.cpp index d3806f131..34b40ebb5 100644 --- a/tests/benchmarks/json_view/bench_corpus.cpp +++ b/tests/benchmarks/json_view/bench_corpus.cpp @@ -220,7 +220,8 @@ int main(int argc, char** argv) { if (std::strcmp(argv[i], "--rounds") == 0 && i + 1 < argc) { - rounds = std::atoi(argv[++i]); + // (clamped: 0 rounds by size, at most a million) + rounds = static_cast((std::min)((std::max)(std::strtol(argv[++i], nullptr, 10), 0L), 1000000L)); } else { @@ -228,6 +229,11 @@ int main(int argc, char** argv) } } std::FILE* csv = std::fopen("bench_corpus.csv", "w"); + if (csv == nullptr) + { + std::perror("bench_corpus.csv"); + return 1; + } std::fprintf(csv, "file,bytes,workload,engine,ns\n"); json_document reused; simdjson::dom::parser sj; diff --git a/tests/benchmarks/json_view/bench_edit.cpp b/tests/benchmarks/json_view/bench_edit.cpp index d5b35f912..c43da11af 100644 --- a/tests/benchmarks/json_view/bench_edit.cpp +++ b/tests/benchmarks/json_view/bench_edit.cpp @@ -497,7 +497,8 @@ int main(int argc, char** argv) return 1; } const std::string T = std::string(argv[1]) + "/"; - const int rounds = argc > 2 ? std::atoi(argv[2]) : 20; + // (clamped to 1 to a million) + const int rounds = argc > 2 ? static_cast((std::min)((std::max)(std::strtol(argv[2], nullptr, 10), 1L), 1000000L)) : 20; const std::string only = argc > 3 ? argv[3] : ""; struct doc { @@ -526,6 +527,11 @@ int main(int argc, char** argv) }; std::FILE* csv = std::fopen("bench_edit.csv", "w"); + if (csv == nullptr) + { + std::perror("bench_edit.csv"); + return 1; + } std::fprintf(csv, "doc,bytes,workload,engine,ns\n"); for (const auto& dc : docs) { diff --git a/tests/benchmarks/json_view/bench_view.cpp b/tests/benchmarks/json_view/bench_view.cpp index 4f4234db5..32d038649 100644 --- a/tests/benchmarks/json_view/bench_view.cpp +++ b/tests/benchmarks/json_view/bench_view.cpp @@ -608,7 +608,8 @@ int main(int argc, char** argv) return 1; } const std::string T = std::string(argv[1]) + "/"; - const int rounds = argc > 2 ? std::atoi(argv[2]) : 30; + // (clamped to 1 to a million) + const int rounds = argc > 2 ? static_cast((std::min)((std::max)(std::strtol(argv[2], nullptr, 10), 1L), 1000000L)) : 30; const std::string only = argc > 3 ? argv[3] : ""; struct doc { @@ -645,6 +646,11 @@ int main(int argc, char** argv) } std::FILE* csv = std::fopen("bench_view.csv", "w"); + if (csv == nullptr) + { + std::perror("bench_view.csv"); + return 1; + } std::fprintf(csv, "doc,bytes,workload,engine,ns\n"); json_document reused; simdjson::dom::parser sj;