@@ -170,49 +170,71 @@ class CaseEncoder {
170170 void PostProcess (std::string* normalized, std::vector<size_t >* norm_to_orig) {
171171 if (!seen_three_spans_) return ;
172172
173+ // Safety check: ensure norm_to_orig has enough elements
174+ if (norm_to_orig->size () < normalized->size ()) {
175+ return ; // Cannot safely process - sizes don't match
176+ }
177+
173178 std::string normalized_temp;
174179 normalized_temp.reserve (normalized->size ());
175180
176181 std::vector<size_t > norm_to_orig_temp;
177182 norm_to_orig_temp.reserve (norm_to_orig->size ());
178183
179184 const char * sig_it = signature_.data ();
185+ const char * sig_end = signature_.data () + signature_.length ();
180186
181187 auto nrm_it = normalized->cbegin ();
188+ auto nrm_end = normalized->cend ();
182189 auto n2o_it = norm_to_orig->cbegin ();
190+ auto n2o_end = norm_to_orig->cend ();
183191
184192 for (const auto & span : Search (signature_)) {
185193 size_t len = std::distance (sig_it, span.first );
186194
195+ // Bounds check before advancing iterators
196+ if (std::distance (nrm_it, nrm_end) < static_cast <ptrdiff_t >(len) ||
197+ std::distance (n2o_it, n2o_end) < static_cast <ptrdiff_t >(len)) {
198+ break ; // Not enough elements remaining
199+ }
200+
187201 normalized_temp.insert (normalized_temp.end (), nrm_it, nrm_it + len);
188202 norm_to_orig_temp.insert (norm_to_orig_temp.end (), n2o_it, n2o_it + len);
189203
190204 sig_it += len;
191205 nrm_it += len;
192206 n2o_it += len;
207+
208+ // Bounds check before dereferencing
209+ if (n2o_it == n2o_end) break ;
210+
193211 normalized_temp.push_back (cAllUppercase);
194212 norm_to_orig_temp.push_back (*n2o_it);
195213
196214 while (sig_it != span.second ) {
215+ if (sig_it >= sig_end || nrm_it >= nrm_end || n2o_it >= n2o_end) break ;
216+
197217 if (*sig_it == cUppercase) {
198218 sig_it++;
199219 nrm_it++;
200220 n2o_it++;
201221 }
222+ if (sig_it >= sig_end || nrm_it >= nrm_end || n2o_it >= n2o_end) break ;
223+
202224 sig_it++;
203225 normalized_temp.push_back (*nrm_it++);
204226 norm_to_orig_temp.push_back (*n2o_it++);
205227 }
206- if (sig_it != signature_. data () + signature_. length () ) {
207- if (*sig_it != cUppercase) {
228+ if (sig_it != sig_end ) {
229+ if (*sig_it != cUppercase && n2o_it != n2o_end ) {
208230 normalized_temp.push_back (cLowercase);
209231 norm_to_orig_temp.push_back (*n2o_it);
210232 }
211233 }
212234 }
213235
214- if (nrm_it != normalized-> cend ()) normalized_temp.insert (normalized_temp.end (), nrm_it, normalized-> cend () );
215- if (n2o_it != norm_to_orig-> cend ()) norm_to_orig_temp.insert (norm_to_orig_temp.end (), n2o_it, norm_to_orig-> cend () );
236+ if (nrm_it != nrm_end) normalized_temp.insert (normalized_temp.end (), nrm_it, nrm_end );
237+ if (n2o_it != n2o_end) norm_to_orig_temp.insert (norm_to_orig_temp.end (), n2o_it, n2o_end );
216238
217239 normalized->swap (normalized_temp);
218240 norm_to_orig->swap (norm_to_orig_temp);
0 commit comments