@@ -93,9 +93,24 @@ static int php_json_ucs2_to_int(php_json_scanner *s, int size)
9393
9494void php_json_scanner_init (php_json_scanner *s, const char *str, size_t str_len, int options)
9595{
96+ s->token = NULL ;
97+ s->marker = NULL ;
98+ s->ctxmarker = NULL ;
99+ s->pstr = NULL ;
100+ s->str_esc = 0 ;
101+ s->state = 0 ;
102+ s->errcode = PHP_JSON_ERROR_NONE;
103+ s->errpos = 0 ; /* Initialize errpos */
104+ s->utf8_invalid = 0 ;
105+ s->utf8_invalid_count = 0 ;
106+ s->str_start = (php_json_ctype *)str; /* Initialize str_start */
107+ s->input_start = (php_json_ctype *)str; /* Initialize str_start */
108+
96109 s->cursor = (php_json_ctype *) str;
97110 s->limit = (php_json_ctype *) str + str_len;
98111 s->options = options;
112+ s->errpos = 0 ;
113+ s->errcode = 0 ;
99114 PHP_JSON_CONDITION_SET (JS);
100115}
101116
@@ -106,6 +121,29 @@ int php_json_scan(php_json_scanner *s)
106121std:
107122 s->token = s->cursor ;
108123
124+ fprintf (stderr, " Scan: START=%p \n cursor=%p \n token=%p \n str_start=%p \n limit=%p \n value_START='%.*s' \n value_token='%.*s' \n value_cursor='%.*s' \n value_str_start='%.*s' \n " ,
125+ s->input_start ,
126+ s->cursor ,
127+ s->token ,
128+ s->str_start ,
129+ s->limit ,
130+ (int )(s->limit - s->input_start ),
131+ s->input_start ,
132+ (int )(s->limit - s->token ),
133+ s->token ,
134+ (int )(s->limit - s->cursor ),
135+ s->cursor ,
136+ (int )(s->limit - s->str_start ),
137+ s->str_start
138+ );
139+
140+ if (s->cursor >= s->limit ) {
141+ s->errcode = PHP_JSON_ERROR_SYNTAX;
142+ s->errpos = (size_t )(s->str_start - s->input_start );
143+ fprintf (stderr, " End of input: errpos=%zu, cursor=%p, str_start=%p\n " , s->errpos , s->cursor , s->str_start );
144+ return PHP_JSON_T_ERROR;
145+ }
146+
109147/* !re2c
110148 re2c:indent:top = 1;
111149 re2c:yyfill:enable = 0;
201239 return PHP_JSON_T_EOI;
202240 } else {
203241 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
242+ s->errpos = (size_t)(s->str_start - s->input_start);
204243 return PHP_JSON_T_ERROR;
205244 }
206245 }
@@ -213,19 +252,25 @@ std:
213252 }
214253 <JS>CTRL {
215254 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
255+ s->errpos = (size_t)(s->str_start - s->input_start);
216256 return PHP_JSON_T_ERROR;
217257 }
218258 <JS>UTF8 {
219259 s->errcode = PHP_JSON_ERROR_SYNTAX;
260+ s->errpos = (size_t)(s->str_start - s->input_start);
261+ fprintf(stderr, "Syntax error: errpos=%zu, cursor=%p, str_start=%p\n",
262+ s->errpos, s->cursor, s->str_start);
220263 return PHP_JSON_T_ERROR;
221264 }
222265 <JS>ANY {
223266 s->errcode = PHP_JSON_ERROR_UTF8;
267+ s->errpos = (size_t)(s->str_start - s->input_start);
224268 return PHP_JSON_T_ERROR;
225269 }
226270
227271 <STR_P1>CTRL {
228272 s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
273+ s->errpos = (size_t)(s->str_start - s->input_start);
229274 return PHP_JSON_T_ERROR;
230275 }
231276 <STR_P1>UTF16_1 {
246291 }
247292 <STR_P1>UCS2 {
248293 s->errcode = PHP_JSON_ERROR_UTF16;
294+ s->errpos = (size_t)(s->str_start - s->input_start);
249295 return PHP_JSON_T_ERROR;
250296 }
251297 <STR_P1>ESC {
254300 }
255301 <STR_P1>ESCPREF {
256302 s->errcode = PHP_JSON_ERROR_SYNTAX;
303+ s->errpos = (size_t)(s->str_start - s->input_start);
304+ fprintf(stderr, "Syntax error: errpos=%zu, cursor=%p, str_start=%p\n",
305+ s->errpos, s->cursor, s->str_start);
257306 return PHP_JSON_T_ERROR;
258307 }
259308 <STR_P1>["] {
283332 if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
284333 if (s->utf8_invalid_count > INT_MAX - 2) {
285334 s->errcode = PHP_JSON_ERROR_UTF8;
335+ s->errpos = (size_t)(s->str_start - s->input_start);
286336 return PHP_JSON_T_ERROR;
287337 }
288338 s->utf8_invalid_count += 2;
293343 PHP_JSON_CONDITION_GOTO(STR_P1);
294344 }
295345 s->errcode = PHP_JSON_ERROR_UTF8;
346+ s->errpos = (size_t)(s->str_start - s->input_start);
296347 return PHP_JSON_T_ERROR;
297348 }
298349
358409 break;
359410 default:
360411 s->errcode = PHP_JSON_ERROR_SYNTAX;
412+ s->errpos = (size_t)(s->str_start - s->input_start);
413+ fprintf(stderr, "Syntax error: errpos=%zu, cursor=%p, str_start=%p\n",
414+ s->errpos, s->cursor, s->str_start);
361415 return PHP_JSON_T_ERROR;
362416 }
363417 *(s->pstr++) = esc;
386440
387441 <*>ANY {
388442 s->errcode = PHP_JSON_ERROR_SYNTAX;
443+ s->errpos = (size_t)(s->str_start - s->input_start);
444+ fprintf(stderr, "Syntax error: errpos=%zu, cursor=%p, str_start=%p\n",
445+ s->errpos, s->cursor, s->str_start);
389446 return PHP_JSON_T_ERROR;
390447 }
391448*/
0 commit comments