Skip to content

Commit 703310b

Browse files
committed
speculative : fix out-of-bounds read in ngram-map on prompt shrink
1 parent 6ed481e commit 703310b

1 file changed

Lines changed: 7 additions & 8 deletions

File tree

common/ngram-map.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,27 +150,26 @@ void common_ngram_map_begin(
150150
// Update the map from hash to key index (clear outdated entries).
151151
for (size_t i = 0; i < map.key_map.size(); ++i) {
152152
uint32_t key_idx = map.key_map[i];
153-
if (key_idx >= map.size_last_begin) {
153+
if (key_idx != 0 && key_idx + map.size_key > size_begin) {
154154
map.key_map[i] = 0;
155155
count_map_entries_upd++;
156156
}
157157
}
158-
map.key_map_last_idx = (map.size_last_begin > 0) ? map.size_last_begin - 1 : 0;
158+
map.key_map_last_idx = (size_begin > 0) ? (uint32_t) (size_begin - 1) : 0;
159159
}
160160

161161
if (size_begin < map.idx_last_check && !map.keys.empty()) {
162162
// The next token generation will start at index size_begin.
163-
// The tokens between map.size_last_begin and size_begin are no longer valid.
164-
//
165-
// Refresh map: Remove all entries with index >= map.size_last_begin.
163+
// The valid token history is [0, size_begin), so remove any n-gram/m-gram
164+
// that does not fit entirely inside it (idx + size > size_begin).
166165
size_t count_keys = map.keys.size();
167166
size_t count_keys_del = 0;
168167
size_t count_values_del = 0;
169168
for (int32_t i = map.keys.size() - 1; i >= 0; --i) {
170169
common_ngram_map_key & key = map.keys[i];
171-
if (key.key_idx >= map.size_last_begin) {
170+
if (key.key_idx + map.size_key > size_begin) {
172171
// Delete the key.
173-
LOG_DBG("%s: delete key %d at index %zu (>= size_last_begin=%zu)\n", __func__, i, key.key_idx, map.size_last_begin);
172+
LOG_DBG("%s: delete key %d (key_idx=%zu + size_key=%d > size_begin=%zu)\n", __func__, i, key.key_idx, map.size_key, size_begin);
174173
map.keys.erase(map.keys.begin() + i);
175174
count_keys_del++;
176175
continue;
@@ -182,7 +181,7 @@ void common_ngram_map_begin(
182181
// Check the indices of the values.
183182
for (int16_t j = COMMON_NGRAM_MAX_VALUES - 1; j >= 0; --j) {
184183
common_ngram_map_value & value = key.values[j];
185-
if (value.value_idx >= map.size_last_begin) {
184+
if (value.value_idx != 0 && value.value_idx + map.size_value > size_begin) {
186185
// Delete the value.
187186
count_values_del++;
188187

0 commit comments

Comments
 (0)