Skip to content

Commit 73c7b7d

Browse files
committed
Safety: check index of scalar values before use
1 parent 6b02b06 commit 73c7b7d

File tree

8 files changed

+98
-65
lines changed

8 files changed

+98
-65
lines changed

include/simdjson/generic/ondemand/document-inl.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ simdjson_really_inline document::document(ondemand::json_iterator &&_iter) noexc
88
logger::log_start_value(iter, "document");
99
}
1010

11-
simdjson_really_inline void document::assert_at_start() const noexcept {
12-
iter.assert_at_start();
11+
simdjson_really_inline void document::assert_at_root() const noexcept {
12+
iter.assert_at_root();
1313
}
1414
simdjson_really_inline document document::start(json_iterator &&iter) noexcept {
1515
return document(std::forward<json_iterator>(iter));
@@ -19,8 +19,8 @@ simdjson_really_inline value document::as_value() noexcept {
1919
return as_value_iterator();
2020
}
2121
simdjson_really_inline value_iterator document::as_value_iterator() noexcept {
22-
assert_at_start();
23-
return value_iterator(&iter, 1);
22+
assert_at_root();
23+
return value_iterator(&iter, 1, iter.token.checkpoint());
2424
}
2525

2626
simdjson_really_inline simdjson_result<array> document::get_array() & noexcept {
@@ -30,15 +30,12 @@ simdjson_really_inline simdjson_result<object> document::get_object() & noexcept
3030
return as_value().get_object();
3131
}
3232
simdjson_really_inline simdjson_result<uint64_t> document::get_uint64() noexcept {
33-
assert_at_start();
3433
return as_value_iterator().require_root_uint64();
3534
}
3635
simdjson_really_inline simdjson_result<int64_t> document::get_int64() noexcept {
37-
assert_at_start();
3836
return as_value_iterator().require_root_int64();
3937
}
4038
simdjson_really_inline simdjson_result<double> document::get_double() noexcept {
41-
assert_at_start();
4239
return as_value_iterator().require_root_double();
4340
}
4441
simdjson_really_inline simdjson_result<std::string_view> document::get_string() & noexcept {
@@ -48,11 +45,9 @@ simdjson_really_inline simdjson_result<raw_json_string> document::get_raw_json_s
4845
return as_value().get_raw_json_string();
4946
}
5047
simdjson_really_inline simdjson_result<bool> document::get_bool() noexcept {
51-
assert_at_start();
5248
return as_value_iterator().require_root_bool();
5349
}
5450
simdjson_really_inline bool document::is_null() noexcept {
55-
assert_at_start();
5651
return as_value_iterator().is_root_null();
5752
}
5853

include/simdjson/generic/ondemand/document.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ class document {
232232
simdjson_really_inline value_iterator as_value_iterator() noexcept;
233233
static simdjson_really_inline document start(ondemand::json_iterator &&iter) noexcept;
234234

235-
simdjson_really_inline void assert_at_start() const noexcept;
235+
simdjson_really_inline void assert_at_root() const noexcept;
236236

237237
//
238238
// Fields

include/simdjson/generic/ondemand/json_iterator-inl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ simdjson_warn_unused simdjson_really_inline error_code json_iterator::skip_child
9090
return report_error(TAPE_ERROR, "not enough close braces");
9191
}
9292

93-
simdjson_really_inline bool json_iterator::at_start() const noexcept {
94-
return token.index == &parser->dom_parser.structural_indexes[0];
93+
simdjson_really_inline bool json_iterator::at_root() const noexcept {
94+
return token.index == parser->dom_parser.structural_indexes.get();
9595
}
9696

97-
simdjson_really_inline void json_iterator::assert_at_start() const noexcept {
97+
simdjson_really_inline void json_iterator::assert_at_root() const noexcept {
9898
SIMDJSON_ASSUME( _depth == 1 );
9999
// Visual Studio Clang treats unique_ptr.get() as "side effecting."
100100
#ifndef SIMDJSON_CLANG_VISUAL_STUDIO

include/simdjson/generic/ondemand/json_iterator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ class json_iterator {
6060
/**
6161
* Tell whether the iterator is still at the start
6262
*/
63-
simdjson_really_inline bool at_start() const noexcept;
63+
simdjson_really_inline bool at_root() const noexcept;
6464

6565
/**
6666
* Assert if the iterator is not at the start
6767
*/
68-
simdjson_really_inline void assert_at_start() const noexcept;
68+
simdjson_really_inline void assert_at_root() const noexcept;
6969

7070
/**
7171
* Tell whether the iterator is at the EOF mark

include/simdjson/generic/ondemand/token_iterator-inl.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ simdjson_really_inline bool token_iterator::operator<=(const token_iterator &oth
3939
return index <= other.index;
4040
}
4141

42+
simdjson_really_inline const uint32_t *token_iterator::checkpoint() const noexcept {
43+
return index;
44+
}
45+
4246
} // namespace ondemand
4347
} // namespace SIMDJSON_IMPLEMENTATION
4448
} // namespace simdjson

include/simdjson/generic/ondemand/token_iterator.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ class token_iterator {
4949
*/
5050
simdjson_really_inline const uint8_t *advance() noexcept;
5151

52+
/**
53+
* Save the current index to be restored later.
54+
*/
55+
simdjson_really_inline const uint32_t *checkpoint() const noexcept;
56+
5257
// NOTE: we don't support a full C++ iterator interface, because we expect people to make
5358
// different calls to advance the iterator based on *their own* state.
5459

@@ -77,6 +82,7 @@ class token_iterator {
7782
const uint32_t *index{};
7883

7984
friend class json_iterator;
85+
friend class value_iterator;
8086
friend simdjson_really_inline void logger::log_line(const json_iterator &iter, const char *title_prefix, const char *title, std::string_view detail, int delta, int depth_delta) noexcept;
8187
};
8288

0 commit comments

Comments
 (0)