216216 return PHP_JSON_T_EOI;
217217 } else {
218218 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
219- s->errpos = (size_t)(s->str_start - s->input_start);
219+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
220220 return PHP_JSON_T_ERROR;
221221 }
222222 }
@@ -229,24 +229,23 @@ std:
229229 }
230230 <JS>CTRL {
231231 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
232- s->errpos = (size_t)(s->str_start - s->input_start);
232+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
233233 return PHP_JSON_T_ERROR;
234234 }
235235 <JS>UTF8 {
236236 s->errcode = PHP_JSON_ERROR_SYNTAX;
237- s->errpos = (size_t)(s->str_start - s->input_start);
238-
237+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count);
239238 return PHP_JSON_T_ERROR;
240239 }
241240 <JS>ANY {
242241 s->errcode = PHP_JSON_ERROR_UTF8;
243- s->errpos = (size_t)(s->str_start - s->input_start);
242+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
244243 return PHP_JSON_T_ERROR;
245244 }
246245
247246 <STR_P1>CTRL {
248247 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
249- s->errpos = (size_t)(s->str_start - s->input_start);
248+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
250249 return PHP_JSON_T_ERROR;
251250 }
252251 <STR_P1>UTF16_1 {
267266 }
268267 <STR_P1>UCS2 {
269268 s->errcode = PHP_JSON_ERROR_UTF16;
270- s->errpos = (size_t)(s->str_start - s->input_start);
269+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
271270 return PHP_JSON_T_ERROR;
272271 }
273272 <STR_P1>ESC {
276275 }
277276 <STR_P1>ESCPREF {
278277 s->errcode = PHP_JSON_ERROR_SYNTAX;
279- s->errpos = (size_t)(s->str_start - s->input_start);
278+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
280279
281280 return PHP_JSON_T_ERROR;
282281 }
307306 if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
308307 if (s->utf8_invalid_count > INT_MAX - 2) {
309308 s->errcode = PHP_JSON_ERROR_UTF8;
310- s->errpos = (size_t)(s->str_start - s->input_start);
309+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
311310 return PHP_JSON_T_ERROR;
312311 }
313312 s->utf8_invalid_count += 2;
318317 PHP_JSON_CONDITION_GOTO(STR_P1);
319318 }
320319 s->errcode = PHP_JSON_ERROR_UTF8;
321- s->errpos = (size_t)(s->str_start - s->input_start);
320+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
322321 return PHP_JSON_T_ERROR;
323322 }
324323
384383 break;
385384 default:
386385 s->errcode = PHP_JSON_ERROR_SYNTAX;
387- s->errpos = (size_t)(s->str_start - s->input_start);
386+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
388387
389388 return PHP_JSON_T_ERROR;
390389 }
414413
415414 <*>ANY {
416415 s->errcode = PHP_JSON_ERROR_SYNTAX;
417- s->errpos = (size_t)(s->str_start - s->input_start);
416+ s->errpos = (size_t)(s->str_start - s->input_start - s->str_esc - s->utf8_invalid_count );
418417
419418 return PHP_JSON_T_ERROR;
420419 }
0 commit comments