Coverage Report

Created: 2026-07-30 06:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/opensips/parser/parse_via.c
Line
Count
Source
1
/*
2
 * via parsing automaton
3
 *
4
 * Copyright (C) 2001-2003 FhG Fokus
5
 *
6
 * This file is part of opensips, a free SIP server.
7
 *
8
 * opensips is free software; you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation; either version 2 of the License, or
11
 * (at your option) any later version
12
 *
13
 * opensips is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
21
 */
22
23
24
25
/*
26
 *  2003-01-21  added rport parsing code, contributed by
27
 *               Maxim Sobolev  <sobomax@FreeBSD.org>
28
 *  2003-01-23  added extra via param parsing code (i=...), used
29
 *               by tcp to identify the sending socket, by andrei
30
 *  2003-01-23  fixed rport parsing code to accept rport w/o any value,
31
 *               by andrei
32
 *  2003-01-27  modified parse_via to set new via_param->start member and
33
 *               via->params.s (andrei)
34
 *  2003-01-28  zero-terminations replaced with VIA_ZT (jiri)
35
 *  2003-02-28  scratchpad compatibility abandoned (jiri)
36
 *  2003-04-26  ZSW (jiri)
37
 *  2003-06-23  fixed  parse_via_param [op].* param. parsing bug (andrei)
38
 *  2003-07-02  added support for TLS parsing in via (andrei)
39
 *  2003-10-27  added support for alias via param parsing [see
40
 *               draft-ietf-sip-connect-reuse-00.txt.]  (andrei)
41
 *  2004-03-31  fixed rport set instead of i bug (andrei)
42
 *  2005-03-02  if via has multiple bodies, and one of them is bad set
43
 *               also the first one as bad (andrei)
44
 */
45
46
47
48
#include <stdlib.h>
49
#include <string.h>
50
#include "../dprint.h"
51
#include "../ut.h"
52
#include "../ip_addr.h"
53
#include "../mem/mem.h"
54
#include "parse_via.h"
55
#include "parse_def.h"
56
57
58
59
/* main via states (uri:port ...) */
60
enum {
61
  F_HOST, P_HOST,
62
  L_PORT, F_PORT, P_PORT,
63
  L_PARAM, F_PARAM, P_PARAM,
64
  L_VIA, F_VIA,
65
  F_COMMENT, P_COMMENT,
66
  F_IP6HOST, P_IP6HOST,
67
  F_CRLF,
68
  F_LF,
69
  F_CR,
70
  END_OF_HEADER
71
};
72
73
74
/* first via part state */
75
enum {
76
  F_SIP = 100,
77
  SIP1, SIP2, FIN_SIP,
78
  L_VER, F_VER,
79
  VER1, VER2, FIN_VER,
80
  UDP1, UDP2, FIN_UDP,
81
  TCP_TLS1, TCP2, FIN_TCP,
82
  TLS2, FIN_TLS,
83
  SCTP1, SCTP2, SCTP3, FIN_SCTP,
84
  WS1, WS_WSS, FIN_WS, FIN_WSS,
85
  OTHER_PROTO,
86
  L_PROTO, F_PROTO
87
};
88
89
90
/* param related states
91
 * WARNING: keep in sync with parse_via.h, PARAM_HIDDEN, ...
92
 */
93
enum {
94
  L_VALUE = 200, F_VALUE, P_VALUE, P_STRING,
95
  HIDDEN1, HIDDEN2, HIDDEN3, HIDDEN4, HIDDEN5,
96
  TTL1, TTL2,
97
  BRANCH1, BRANCH2, BRANCH3, BRANCH4, BRANCH5,
98
  MADDR1, MADDR2, MADDR3, MADDR4,
99
  RECEIVED1, RECEIVED2, RECEIVED3, RECEIVED4, RECEIVED5, RECEIVED6,
100
  RECEIVED7,
101
  RPORT1, RPORT2, RPORT3,
102
  ALIAS1, ALIAS2, ALIAS3, ALIAS4,
103
       /* fin states (227-...)*/
104
  FIN_HIDDEN = 230, FIN_TTL, FIN_BRANCH,
105
  FIN_MADDR, FIN_RECEIVED, FIN_RPORT, FIN_I, FIN_ALIAS
106
       /*GEN_PARAM,
107
         PARAM_ERROR*/ /* declared in msg_parser.h*/
108
};
109
110
111
/* entry state must be F_PARAM, or saved_state=F_PARAM and
112
 * state=F_{LF,CR,CRLF}!
113
 * output state = L_PARAM or F_PARAM or END_OF_HEADER
114
 * (and saved_state= last state); everything else => error
115
 * WARNING: param->start must be filled before, it's used in param->size
116
 * computation.
117
 */
118
static /*inline*/ char* parse_via_param(char* p, char* end,
119
                    unsigned char* pstate,
120
                      unsigned char* psaved_state,
121
                    struct via_param* param)
122
132k
{
123
132k
  char* tmp;
124
132k
  register unsigned char state;
125
132k
  unsigned char saved_state;
126
127
132k
  state=*pstate;
128
129
132k
  saved_state=*psaved_state;
130
132k
  param->type=PARAM_ERROR;
131
132
1.38M
  for (tmp=p;tmp<end;tmp++){
133
1.38M
    switch(*tmp){
134
3.45k
      case ' ':
135
6.65k
      case '\t':
136
6.65k
        switch(state){
137
672
          case FIN_HIDDEN:
138
1.06k
          case FIN_ALIAS:
139
1.06k
            param->type=state;
140
1.06k
            param->name.len=tmp-param->name.s;
141
1.06k
            state=L_PARAM;
142
1.06k
            goto endofparam;
143
396
          case FIN_BRANCH:
144
1.05k
          case FIN_TTL:
145
1.44k
          case FIN_MADDR:
146
1.90k
          case FIN_RECEIVED:
147
2.84k
          case FIN_RPORT:
148
3.50k
          case FIN_I:
149
3.50k
            param->type=state;
150
3.50k
            param->name.len=tmp-param->name.s;
151
3.50k
            state=L_VALUE;
152
3.50k
            goto find_value;
153
0
          case F_PARAM:
154
0
            break;
155
0
          case F_LF:
156
0
          case F_CR:
157
0
          case F_CRLF:
158
0
            state=saved_state;
159
0
            break;
160
1.94k
          case GEN_PARAM:
161
2.08k
          default:
162
2.08k
            param->type=GEN_PARAM;
163
2.08k
            param->name.len=tmp-param->name.s;
164
2.08k
            state=L_VALUE;
165
2.08k
            goto find_value;
166
6.65k
        }
167
0
        break;
168
      /* \n and \r*/
169
17.8k
      case '\n':
170
17.8k
        switch(state){
171
449
          case FIN_HIDDEN:
172
933
          case FIN_ALIAS:
173
933
            param->type=state;
174
933
            param->name.len=tmp-param->name.s;
175
933
            param->size=tmp-param->start;
176
933
            saved_state=L_PARAM;
177
933
            state=F_LF;
178
933
            goto endofparam;
179
508
          case FIN_BRANCH:
180
900
          case FIN_TTL:
181
1.29k
          case FIN_MADDR:
182
1.88k
          case FIN_RECEIVED:
183
2.36k
          case FIN_I:
184
3.21k
          case FIN_RPORT:
185
3.21k
            param->type=state;
186
3.21k
            param->name.len=tmp-param->name.s;
187
3.21k
            param->size=tmp-param->start;
188
3.21k
            saved_state=L_VALUE;
189
3.21k
            state=F_LF;
190
3.21k
            goto find_value;
191
0
          case F_PARAM:
192
0
            saved_state=state;
193
0
            state=F_LF;
194
0
            break;
195
0
          case F_LF:
196
0
          case F_CRLF:
197
0
            state=END_OF_HEADER;
198
0
            goto end_via;
199
0
          case F_CR:
200
0
            state=F_CRLF;
201
0
            break;
202
10.7k
          case GEN_PARAM:
203
13.6k
          default:
204
13.6k
            param->type=GEN_PARAM;
205
13.6k
            saved_state=L_VALUE;
206
13.6k
            param->name.len=tmp-param->name.s;
207
13.6k
            param->size=tmp-param->start;
208
13.6k
            state=F_LF;
209
13.6k
            goto find_value;
210
17.8k
        }
211
0
        break;
212
14.4k
      case '\r':
213
14.4k
        switch(state){
214
2.37k
          case FIN_HIDDEN:
215
2.63k
          case FIN_ALIAS:
216
2.63k
            param->type=state;
217
2.63k
            param->name.len=tmp-param->name.s;
218
2.63k
            param->size=tmp-param->start;
219
2.63k
            saved_state=L_PARAM;
220
2.63k
            state=F_CR;
221
2.63k
            goto endofparam;
222
392
          case FIN_BRANCH:
223
781
          case FIN_TTL:
224
1.27k
          case FIN_MADDR:
225
1.67k
          case FIN_RECEIVED:
226
2.26k
          case FIN_I:
227
4.31k
          case FIN_RPORT:
228
4.31k
            param->type=state;
229
4.31k
            param->name.len=tmp-param->name.s;
230
4.31k
            param->size=tmp-param->start;
231
4.31k
            saved_state=L_VALUE;
232
4.31k
            state=F_CR;
233
4.31k
            goto find_value;
234
0
          case F_PARAM:
235
0
            saved_state=state;
236
0
            state=F_CR;
237
0
            break;
238
0
          case F_CR:
239
0
          case F_CRLF:
240
0
            state=END_OF_HEADER;
241
0
            goto end_via;
242
7.05k
          case GEN_PARAM:
243
7.54k
          default:
244
7.54k
            param->type=GEN_PARAM;
245
7.54k
            param->name.len=tmp-param->name.s;
246
7.54k
            param->size=tmp-param->start;
247
7.54k
            saved_state=L_VALUE;
248
7.54k
            state=F_CR;
249
7.54k
            goto find_value;
250
14.4k
        }
251
0
        break;
252
253
13.7k
      case '=':
254
13.7k
        switch(state){
255
547
          case FIN_BRANCH:
256
1.32k
          case FIN_TTL:
257
2.04k
          case FIN_MADDR:
258
2.50k
          case FIN_RECEIVED:
259
3.15k
          case FIN_RPORT:
260
4.01k
          case FIN_I:
261
4.01k
            param->type=state;
262
4.01k
            param->name.len=tmp-param->name.s;
263
4.01k
            state=F_VALUE;
264
4.01k
            goto find_value;
265
8
          case F_PARAM:
266
11
          case FIN_HIDDEN:
267
13
          case FIN_ALIAS:
268
13
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
269
13
            goto parse_error;
270
0
          case F_CR:
271
0
          case F_LF:
272
0
          case F_CRLF:
273
0
            state=END_OF_HEADER;
274
0
            goto end_via;
275
7.79k
          case GEN_PARAM:
276
9.68k
          default:
277
9.68k
            param->type=GEN_PARAM;
278
9.68k
            param->name.len=tmp-param->name.s;
279
9.68k
            state=F_VALUE;
280
9.68k
            goto find_value;
281
13.7k
        }
282
0
        break;
283
76.1k
      case ';':
284
76.1k
        switch(state){
285
14.0k
          case FIN_HIDDEN:
286
15.6k
          case FIN_RPORT: /* rport can appear w/o a value */
287
16.5k
          case FIN_ALIAS:
288
16.5k
            param->type=state;
289
16.5k
            param->name.len=tmp-param->name.s;
290
16.5k
            state=F_PARAM;
291
16.5k
            goto endofparam;
292
3
          case FIN_BRANCH:
293
6
          case FIN_MADDR:
294
8
          case FIN_TTL:
295
10
          case FIN_RECEIVED:
296
12
          case FIN_I:
297
12
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
298
12
            goto parse_error;
299
0
          case F_CR:
300
0
          case F_LF:
301
0
          case F_CRLF:
302
0
            state=END_OF_HEADER;
303
0
            goto end_via;
304
45.9k
          case GEN_PARAM:
305
59.6k
          default:
306
59.6k
            param->type=GEN_PARAM;
307
59.6k
            param->name.len=tmp-param->name.s;
308
59.6k
            state=F_PARAM;
309
59.6k
            goto endofparam;
310
76.1k
        }
311
0
        break;
312
2.36k
      case ',':
313
2.36k
        switch(state){
314
704
          case FIN_HIDDEN:
315
1.10k
          case FIN_RPORT:
316
1.56k
          case FIN_ALIAS:
317
1.56k
            param->type=state;
318
1.56k
            param->name.len=tmp-param->name.s;
319
1.56k
            state=F_VIA;
320
1.56k
            goto endofvalue;
321
2
          case FIN_BRANCH:
322
4
          case FIN_MADDR:
323
6
          case FIN_TTL:
324
8
          case FIN_RECEIVED:
325
10
          case FIN_I:
326
10
            LM_ERR("new via found (',') when '=' expected"
327
10
                "(state %d=)\n", state);
328
10
            goto parse_error; /* or we could ignore this bad param*/
329
0
          case F_CR:
330
0
          case F_LF:
331
0
          case F_CRLF:
332
0
            state=END_OF_HEADER;
333
0
            goto end_via;
334
766
          case GEN_PARAM:
335
789
          default:
336
789
            param->type=GEN_PARAM;
337
789
            param->name.len=tmp-param->name.s;
338
789
            state=F_VIA;
339
789
            goto endofvalue;
340
2.36k
        }
341
0
        break;
342
343
        /* param names */
344
36.9k
      case 'h':
345
41.9k
      case 'H':
346
41.9k
        switch(state){
347
31.4k
          case F_PARAM:
348
31.4k
            state=HIDDEN1;
349
31.4k
            param->name.s=tmp;
350
31.4k
            break;
351
1.43k
          case BRANCH5:
352
1.43k
            state=FIN_BRANCH;
353
1.43k
            break;
354
7.47k
          case GEN_PARAM:
355
7.47k
            break;
356
0
          case F_CR:
357
0
          case F_LF:
358
0
          case F_CRLF:
359
0
            state=END_OF_HEADER;
360
0
            goto end_via;
361
1.63k
          default:
362
1.63k
            state=GEN_PARAM;
363
41.9k
        }
364
41.9k
        break;
365
42.7k
      case 'i':
366
54.9k
      case 'I':
367
54.9k
        switch(state){
368
3.83k
          case F_PARAM:
369
3.83k
            state=FIN_I;
370
3.83k
            param->name.s=tmp;
371
3.83k
            break;
372
28.5k
          case HIDDEN1:
373
28.5k
            state=HIDDEN2;
374
28.5k
            break;
375
3.22k
          case RECEIVED4:
376
3.22k
            state=RECEIVED5;
377
3.22k
            break;
378
4.68k
          case ALIAS2:
379
4.68k
            state=ALIAS3;
380
4.68k
            break;
381
12.8k
          case GEN_PARAM:
382
12.8k
            break;
383
0
          case F_CR:
384
0
          case F_LF:
385
0
          case F_CRLF:
386
0
            state=END_OF_HEADER;
387
0
            goto end_via;
388
1.89k
          default:
389
1.89k
            state=GEN_PARAM;
390
54.9k
        }
391
54.9k
        break;
392
87.8k
      case 'd':
393
91.6k
      case 'D':
394
91.6k
        switch(state){
395
2.42k
          case F_PARAM:
396
2.42k
            state=GEN_PARAM;
397
2.42k
            param->name.s=tmp;
398
2.42k
            break;
399
27.4k
          case HIDDEN2:
400
27.4k
            state=HIDDEN3;
401
27.4k
            break;
402
25.1k
          case HIDDEN3:
403
25.1k
            state=HIDDEN4;
404
25.1k
            break;
405
5.48k
          case MADDR2:
406
5.48k
            state=MADDR3;
407
5.48k
            break;
408
3.80k
          case MADDR3:
409
3.80k
            state=MADDR4;
410
3.80k
            break;
411
2.08k
          case RECEIVED7:
412
2.08k
            state=FIN_RECEIVED;
413
2.08k
            break;
414
23.1k
          case GEN_PARAM:
415
23.1k
            break;
416
0
          case F_CR:
417
0
          case F_LF:
418
0
          case F_CRLF:
419
0
            state=END_OF_HEADER;
420
0
            goto end_via;
421
2.13k
          default:
422
2.13k
            state=GEN_PARAM;
423
91.6k
        }
424
91.6k
        break;
425
91.6k
      case 'e':
426
57.5k
      case 'E':
427
57.5k
        switch(state){
428
2.11k
          case F_PARAM:
429
2.11k
            state=GEN_PARAM;
430
2.11k
            param->name.s=tmp;
431
2.11k
            break;
432
19.9k
          case HIDDEN4:
433
19.9k
            state=HIDDEN5;
434
19.9k
            break;
435
5.62k
          case RECEIVED1:
436
5.62k
            state=RECEIVED2;
437
5.62k
            break;
438
3.66k
          case RECEIVED3:
439
3.66k
            state=RECEIVED4;
440
3.66k
            break;
441
2.30k
          case RECEIVED6:
442
2.30k
            state=RECEIVED7;
443
2.30k
            break;
444
21.2k
          case GEN_PARAM:
445
21.2k
            break;
446
0
          case F_CR:
447
0
          case F_LF:
448
0
          case F_CRLF:
449
0
            state=END_OF_HEADER;
450
0
            goto end_via;
451
2.59k
          default:
452
2.59k
            state=GEN_PARAM;
453
57.5k
        }
454
57.5k
        break;
455
57.5k
      case 'n':
456
43.8k
      case 'N':
457
43.8k
        switch(state){
458
1.75k
          case F_PARAM:
459
1.75k
            state=GEN_PARAM;
460
1.75k
            param->name.s=tmp;
461
1.75k
            break;
462
15.3k
          case HIDDEN5:
463
15.3k
            state=FIN_HIDDEN;
464
15.3k
            break;
465
3.44k
          case BRANCH3:
466
3.44k
            state=BRANCH4;
467
3.44k
            break;
468
21.7k
          case GEN_PARAM:
469
21.7k
            break;
470
0
          case F_CR:
471
0
          case F_LF:
472
0
          case F_CRLF:
473
0
            state=END_OF_HEADER;
474
0
            goto end_via;
475
1.59k
          default:
476
1.59k
            state=GEN_PARAM;
477
43.8k
        }
478
43.8k
        break;
479
43.8k
      case 't':
480
36.5k
      case 'T':
481
36.5k
        switch(state){
482
11.1k
          case F_PARAM:
483
11.1k
            state=TTL1;
484
11.1k
            param->name.s=tmp;
485
11.1k
            break;
486
3.01k
          case TTL1:
487
3.01k
            state=TTL2;
488
3.01k
            break;
489
6.93k
          case RPORT3:
490
6.93k
            state=FIN_RPORT;
491
6.93k
            break;
492
13.5k
          case GEN_PARAM:
493
13.5k
            break;
494
0
          case F_CR:
495
0
          case F_LF:
496
0
          case F_CRLF:
497
0
            state=END_OF_HEADER;
498
0
            goto end_via;
499
1.87k
          default:
500
1.87k
            state=GEN_PARAM;
501
36.5k
        }
502
36.5k
        break;
503
36.5k
      case 'l':
504
16.8k
      case 'L':
505
16.8k
        switch(state){
506
2.81k
          case F_PARAM:
507
2.81k
            state=GEN_PARAM;
508
2.81k
            param->name.s=tmp;
509
2.81k
            break;
510
2.15k
          case TTL2:
511
2.15k
            state=FIN_TTL;
512
2.15k
            break;
513
5.86k
          case ALIAS1:
514
5.86k
            state=ALIAS2;
515
5.86k
            break;
516
5.31k
          case GEN_PARAM:
517
5.31k
            break;
518
0
          case F_CR:
519
0
          case F_LF:
520
0
          case F_CRLF:
521
0
            state=END_OF_HEADER;
522
0
            goto end_via;
523
663
          default:
524
663
            state=GEN_PARAM;
525
16.8k
        }
526
16.8k
        break;
527
16.8k
      case 'm':
528
17.4k
      case 'M':
529
17.4k
        switch(state){
530
11.4k
          case F_PARAM:
531
11.4k
            state=MADDR1;
532
11.4k
            param->name.s=tmp;
533
11.4k
            break;
534
4.90k
          case GEN_PARAM:
535
4.90k
            break;
536
0
          case F_CR:
537
0
          case F_LF:
538
0
          case F_CRLF:
539
0
            state=END_OF_HEADER;
540
0
            goto end_via;
541
1.03k
          default:
542
1.03k
            state=GEN_PARAM;
543
17.4k
        }
544
17.4k
        break;
545
182k
      case 'a':
546
198k
      case 'A':
547
198k
        switch(state){
548
14.4k
          case F_PARAM:
549
14.4k
            state=ALIAS1;
550
14.4k
            param->name.s=tmp;
551
14.4k
            break;
552
7.09k
          case MADDR1:
553
7.09k
            state=MADDR2;
554
7.09k
            break;
555
3.70k
          case BRANCH2:
556
3.70k
            state=BRANCH3;
557
3.70k
            break;
558
3.26k
          case ALIAS3:
559
3.26k
            state=ALIAS4;
560
3.26k
            break;
561
167k
          case GEN_PARAM:
562
167k
            break;
563
0
          case F_CR:
564
0
          case F_LF:
565
0
          case F_CRLF:
566
0
            state=END_OF_HEADER;
567
0
            goto end_via;
568
2.91k
          default:
569
2.91k
            state=GEN_PARAM;
570
198k
        }
571
198k
        break;
572
198k
      case 'r':
573
51.4k
      case 'R':
574
51.4k
        switch(state){
575
1.95k
          case MADDR4:
576
1.95k
            state=FIN_MADDR;
577
1.95k
            break;
578
22.1k
          case F_PARAM:
579
22.1k
            state=RECEIVED1;
580
22.1k
            param->name.s=tmp;
581
22.1k
            break;
582
4.14k
          case BRANCH1:
583
4.14k
            state=BRANCH2;
584
4.14k
            break;
585
7.29k
          case RPORT2:
586
7.29k
            state=RPORT3;
587
7.29k
            break;
588
14.3k
          case GEN_PARAM:
589
14.3k
            break;
590
0
          case F_CR:
591
0
          case F_LF:
592
0
          case F_CRLF:
593
0
            state=END_OF_HEADER;
594
0
            goto end_via;
595
1.62k
          default:
596
1.62k
            state=GEN_PARAM;
597
51.4k
        }
598
51.4k
        break;
599
51.4k
      case 'c':
600
18.9k
      case 'C':
601
18.9k
        switch(state){
602
1.22k
          case F_PARAM:
603
1.22k
            state=GEN_PARAM;
604
1.22k
            param->name.s=tmp;
605
1.22k
            break;
606
4.00k
          case RECEIVED2:
607
4.00k
            state=RECEIVED3;
608
4.00k
            break;
609
3.14k
          case BRANCH4:
610
3.14k
            state=BRANCH5;
611
3.14k
            break;
612
9.31k
          case GEN_PARAM:
613
9.31k
            break;
614
0
          case F_CR:
615
0
          case F_LF:
616
0
          case F_CRLF:
617
0
            state=END_OF_HEADER;
618
0
            goto end_via;
619
1.21k
          default:
620
1.21k
            state=GEN_PARAM;
621
18.9k
        }
622
18.9k
        break;
623
18.9k
      case 'v':
624
23.8k
      case 'V':
625
23.8k
        switch(state){
626
2.65k
          case F_PARAM:
627
2.65k
            state=GEN_PARAM;
628
2.65k
            param->name.s=tmp;
629
2.65k
            break;
630
2.68k
          case RECEIVED5:
631
2.68k
            state=RECEIVED6;
632
2.68k
            break;
633
17.3k
          case GEN_PARAM:
634
17.3k
            break;
635
0
          case F_CR:
636
0
          case F_LF:
637
0
          case F_CRLF:
638
0
            state=END_OF_HEADER;
639
0
            goto end_via;
640
1.07k
          default:
641
1.07k
            state=GEN_PARAM;
642
23.8k
        }
643
23.8k
        break;
644
23.8k
      case 'b':
645
21.1k
      case 'B':
646
21.1k
        switch(state){
647
6.46k
          case F_PARAM:
648
6.46k
            state=BRANCH1;
649
6.46k
            param->name.s=tmp;
650
6.46k
            break;
651
12.7k
          case GEN_PARAM:
652
12.7k
            break;
653
0
          case F_CR:
654
0
          case F_LF:
655
0
          case F_CRLF:
656
0
            state=END_OF_HEADER;
657
0
            goto end_via;
658
1.88k
          default:
659
1.88k
            state=GEN_PARAM;
660
21.1k
        }
661
21.1k
        break;
662
21.1k
      case 'p':
663
22.0k
      case 'P':
664
22.0k
        switch(state){
665
1.59k
          case F_PARAM:
666
1.59k
            state=GEN_PARAM;
667
1.59k
            param->name.s=tmp;
668
1.59k
            break;
669
10.3k
          case RECEIVED1:
670
10.3k
            state=RPORT1;
671
10.3k
            break;
672
0
          case F_CR:
673
0
          case F_LF:
674
0
          case F_CRLF:
675
0
            state=END_OF_HEADER;
676
0
            goto end_via;
677
10.1k
          default:
678
10.1k
            state=GEN_PARAM;
679
22.0k
        }
680
22.0k
        break;
681
60.0k
      case 'o':
682
64.8k
      case 'O':
683
64.8k
        switch(state){
684
1.33k
          case F_PARAM:
685
1.33k
            state=GEN_PARAM;
686
1.33k
            param->name.s=tmp;
687
1.33k
            break;
688
9.25k
          case RPORT1:
689
9.25k
            state=RPORT2;
690
9.25k
            break;
691
0
          case F_CR:
692
0
          case F_LF:
693
0
          case F_CRLF:
694
0
            state=END_OF_HEADER;
695
0
            goto end_via;
696
54.2k
          default:
697
54.2k
            state=GEN_PARAM;
698
64.8k
        }
699
64.8k
        break;
700
64.8k
      case 's':
701
17.0k
      case 'S':
702
17.0k
        switch(state){
703
2.48k
          case F_PARAM:
704
2.48k
            state=GEN_PARAM;
705
2.48k
            param->name.s=tmp;
706
2.48k
            break;
707
2.75k
          case ALIAS4:
708
2.75k
            state=FIN_ALIAS;
709
2.75k
            break;
710
0
          case F_CR:
711
0
          case F_LF:
712
0
          case F_CRLF:
713
0
            state=END_OF_HEADER;
714
0
            goto end_via;
715
11.8k
          default:
716
11.8k
            state=GEN_PARAM;
717
17.0k
        }
718
17.0k
        break;
719
470k
      default:
720
470k
        switch(state){
721
13.3k
          case F_PARAM:
722
13.3k
            state=GEN_PARAM;
723
13.3k
            param->name.s=tmp;
724
13.3k
            break;
725
440k
          case GEN_PARAM:
726
440k
            break;
727
0
          case F_CR:
728
0
          case F_LF:
729
0
          case F_CRLF:
730
0
            state=END_OF_HEADER;
731
0
            goto end_via;
732
16.1k
          default:
733
16.1k
            state=GEN_PARAM;
734
470k
        }
735
1.38M
    }
736
1.38M
  }/* for tmp*/
737
738
  /* end of packet? => error, no cr/lf,',' found!!!*/
739
1.31k
  saved_state=state;
740
1.31k
  state=END_OF_HEADER;
741
1.31k
  goto parse_error;
742
743
48.0k
 find_value:
744
48.0k
  tmp++;
745
1.56M
  for(;tmp<end;tmp++){
746
1.56M
    switch(*tmp){
747
9.92k
      case ' ':
748
27.7k
      case '\t':
749
27.7k
        switch(state){
750
3.17k
          case L_VALUE:
751
12.7k
          case F_VALUE: /*eat space*/
752
12.7k
            break;
753
829
          case P_VALUE:
754
829
            state=L_PARAM;
755
829
            param->value.len=tmp-param->value.s;
756
829
            goto endofvalue;
757
1.53k
          case P_STRING:
758
1.53k
            break;
759
4.87k
          case F_CR:
760
10.7k
          case F_LF:
761
12.5k
          case F_CRLF:
762
12.5k
            state=saved_state;
763
12.5k
            break;
764
0
          default:
765
0
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
766
0
            goto parse_error;
767
27.7k
        }
768
26.8k
        break;
769
26.8k
      case '\n':
770
8.44k
        switch(state){
771
1.40k
          case L_VALUE:
772
2.07k
          case F_VALUE: /*eat space*/
773
2.78k
          case P_STRING:
774
2.78k
            saved_state=state;
775
2.78k
            param->size=tmp-param->start;
776
2.78k
            state=F_LF;
777
2.78k
            break;
778
1.10k
          case P_VALUE:
779
1.10k
            saved_state=L_PARAM;
780
1.10k
            state=F_LF;
781
1.10k
            param->value.len=tmp-param->value.s;
782
1.10k
            goto endofvalue;
783
10
          case F_LF:
784
13
          case F_CRLF:
785
13
            state=END_OF_HEADER;
786
13
            goto end_via;
787
4.54k
          case F_CR:
788
4.54k
            state=F_CRLF;
789
4.54k
            break;
790
0
          default:
791
0
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
792
0
            goto parse_error;
793
8.44k
        }
794
7.32k
        break;
795
7.32k
      case '\r':
796
4.87k
        switch(state){
797
1.72k
          case L_VALUE:
798
2.77k
          case F_VALUE: /*eat space*/
799
3.48k
          case P_STRING:
800
3.48k
            saved_state=state;
801
3.48k
            param->size=tmp-param->start;
802
3.48k
            state=F_CR;
803
3.48k
            break;
804
1.37k
          case P_VALUE:
805
1.37k
            param->value.len=tmp-param->value.s;
806
1.37k
            saved_state=L_PARAM;
807
1.37k
            state=F_CR;
808
1.37k
            goto endofvalue;
809
10
          case F_LF:
810
16
          case F_CR:
811
19
          case F_CRLF:
812
19
            state=END_OF_HEADER;
813
19
            goto end_via;
814
0
          default:
815
0
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
816
0
            goto parse_error;
817
4.87k
        }
818
3.48k
        break;
819
820
15.9k
      case '=':
821
15.9k
        switch(state){
822
11.1k
          case L_VALUE:
823
11.1k
            state=F_VALUE;
824
11.1k
            break;
825
1.14k
          case P_STRING:
826
1.14k
            break;
827
627
          case F_LF:
828
3.08k
          case F_CR:
829
3.60k
          case F_CRLF:
830
3.60k
            state=END_OF_HEADER;
831
3.60k
            goto end_via;
832
7
          default:
833
7
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
834
7
            goto parse_error;
835
15.9k
        }
836
12.3k
        break;
837
24.2k
      case ';':
838
24.2k
        switch(state){
839
6.55k
          case P_VALUE:
840
6.55k
            param->value.len=tmp-param->value.s;
841
6.55k
            state=F_PARAM;
842
6.55k
            goto endofvalue;
843
12.4k
          case F_VALUE:
844
12.4k
            param->value.len=0;
845
12.4k
            state=F_PARAM;
846
12.4k
            goto endofvalue;
847
1.44k
          case P_STRING:
848
1.44k
            break; /* what to do? */
849
1.44k
          case F_LF:
850
1.95k
          case F_CR:
851
2.72k
          case F_CRLF:
852
2.72k
            state=END_OF_HEADER;
853
2.72k
            goto end_via;
854
1.09k
          case L_VALUE:
855
1.09k
            if (param->type==FIN_RPORT){
856
1.08k
              param->value.len=0;
857
1.08k
              param->value.s=0; /* null value */
858
1.08k
              state=F_PARAM;
859
1.08k
              goto endofvalue;
860
1.08k
            };
861
            /* no break */
862
13
          default:
863
13
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
864
13
            goto parse_error;
865
24.2k
        }
866
1.44k
        break;
867
2.57k
      case ',':
868
2.57k
        switch(state){
869
394
          case P_VALUE:
870
394
            param->value.len=tmp-param->value.s;
871
394
            state=F_VIA;
872
394
            goto endofvalue;
873
434
          case P_STRING:
874
848
          case F_LF:
875
1.40k
          case F_CR:
876
1.79k
          case F_CRLF:
877
1.79k
            state=END_OF_HEADER;
878
1.79k
            goto end_via;
879
392
          case L_VALUE:
880
392
            if (param->type==FIN_RPORT){
881
389
              param->value.len=0;
882
389
              param->value.s=0; /* null value */
883
389
              state=F_VIA;
884
389
              goto endofvalue;
885
389
            };
886
            /* no break */
887
6
          default:
888
6
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
889
6
            goto parse_error;
890
2.57k
        }
891
0
        break; /* what to do? */
892
3.29k
      case '"':
893
3.29k
        switch(state){
894
1.48k
          case F_VALUE:
895
1.48k
            state=P_STRING;
896
1.48k
            param->value.s=tmp+1;
897
1.48k
            break;
898
601
          case P_STRING:
899
601
            state=L_PARAM;
900
601
            param->value.len=tmp-param->value.s;
901
601
            goto endofvalue;
902
433
          case F_LF:
903
821
          case F_CR:
904
1.21k
          case F_CRLF:
905
1.21k
            state=END_OF_HEADER;
906
1.21k
            goto end_via;
907
2
          default:
908
2
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
909
2
            goto parse_error;
910
3.29k
        }
911
1.48k
        break;
912
48.4k
      case '\0':
913
48.4k
        break;
914
915
1.43M
      default:
916
1.43M
        switch(state){
917
10.3k
          case F_VALUE:
918
10.3k
            state=P_VALUE;
919
10.3k
            param->value.s=tmp;
920
10.3k
            break;
921
1.39M
          case P_VALUE:
922
1.40M
          case P_STRING:
923
1.40M
            break;
924
10.7k
          case F_LF:
925
12.6k
          case F_CR:
926
13.2k
          case F_CRLF:
927
13.2k
            state=END_OF_HEADER;
928
13.2k
            goto end_via;
929
45
          default:
930
45
            LM_ERR("invalid char <%c> in state %d\n", *tmp, state);
931
45
            goto parse_error;
932
1.43M
        }
933
1.56M
    }
934
1.56M
  } /* for2 tmp*/
935
936
  /* end of buff and no CR/LF =>error*/
937
567
  saved_state=state;
938
567
  state=END_OF_HEADER;
939
567
  goto parse_error;
940
941
80.8k
 endofparam:
942
107k
 endofvalue:
943
107k
  param->size=tmp-param->start;
944
130k
normal_exit:
945
130k
  *pstate=state;
946
130k
  *psaved_state=saved_state;
947
130k
  LM_DBG("found param type %d, <%.*s> = <%.*s>; state=%d\n", param->type,
948
0
      param->name.len, ZSW(param->name.s),
949
0
      (param->value.len?param->value.len:3),
950
0
      (param->value.len?param->value.s:"n/a"), state);
951
130k
  return tmp;
952
953
22.6k
 end_via:
954
       /* if we are here we found an "unexpected" end of via
955
        *  (cr/lf). This is valid only if the param type is GEN_PARAM or
956
      *  RPORT (the only ones which can miss the value; HIDDEN is a
957
      *  special case )*/
958
22.6k
  if ((param->type==GEN_PARAM)||(param->type==PARAM_RPORT)){
959
22.6k
    saved_state=L_PARAM; /* change the saved_state, we have an unknown
960
                            param. w/o a value */
961
    /* param->size should be computed before */
962
22.6k
    goto normal_exit;
963
22.6k
  }
964
26
  *pstate=state;
965
26
  *psaved_state=saved_state;
966
26
  LM_DBG("error on  param type %d, <%.*s>, state=%d, saved_state=%d\n",
967
26
    param->type, param->name.len, ZSW(param->name.s), state, saved_state);
968
969
2.01k
parse_error:
970
2.01k
  LM_ERR("parse_via_param\n");
971
2.01k
  param->type=PARAM_ERROR;
972
2.01k
  *pstate=PARAM_ERROR;
973
2.01k
  *psaved_state=state;
974
2.01k
  return tmp;
975
26
}
976
977
978
979
/*
980
 * call it with a vb initialized to 0
981
 * returns: pointer after the parsed parts and sets vb->error
982
 * WARNING: don't forget to cleanup on error with free_via_list(vb)!
983
 */
984
char* parse_via(char* buffer, char* end, struct via_body *vbody)
985
151k
{
986
151k
  char* tmp;
987
151k
  char* param_start;
988
151k
  unsigned char state;
989
151k
  unsigned char saved_state;
990
151k
  int c_nest;
991
151k
  int err;
992
151k
  struct via_body* vb;
993
151k
  struct via_param* param;
994
995
151k
  vb=vbody; /* keep orignal vbody value, needed to set the error member
996
         in case of multiple via bodies in the same header */
997
170k
parse_again:
998
170k
  vb->error=PARSE_ERROR;
999
  /* parse start of via ( SIP/2.0/UDP    )*/
1000
170k
  state=F_SIP;
1001
170k
  saved_state=0; /*it should generate error if it's used without set*/
1002
170k
  param_start=0;
1003
3.28M
  for(tmp=buffer;tmp<end;tmp++){
1004
3.27M
    switch(*tmp){
1005
162k
      case ' ':
1006
175k
      case'\t':
1007
175k
        switch(state){
1008
799
          case L_VER: /* eat space */
1009
1.61k
          case L_PROTO:
1010
2.54k
          case F_SIP:
1011
4.71k
          case F_VER:
1012
7.53k
          case F_PROTO:
1013
7.53k
            break;
1014
971
          case FIN_UDP:
1015
971
            vb->transport.len=tmp-vb->transport.s;
1016
971
            vb->proto=PROTO_UDP;
1017
971
            state=F_HOST; /* start looking for host*/
1018
971
            goto main_via;
1019
405
          case FIN_TCP:
1020
            /* finished proto parsing */
1021
405
            vb->transport.len=tmp-vb->transport.s;
1022
405
            vb->proto=PROTO_TCP;
1023
405
            state=F_HOST; /* start looking for host*/
1024
405
            goto main_via;
1025
588
          case FIN_TLS:
1026
            /* finished proto parsing */
1027
588
            vb->transport.len=tmp-vb->transport.s;
1028
588
            vb->proto=PROTO_TLS;
1029
588
            state=F_HOST; /* start looking for host*/
1030
588
            goto main_via;
1031
441
          case FIN_SCTP:
1032
            /* finished proto parsing */
1033
441
            vb->transport.len=tmp-vb->transport.s;
1034
441
            vb->proto=PROTO_SCTP;
1035
441
            state=F_HOST; /* start looking for host*/
1036
441
            goto main_via;
1037
0
          case FIN_WS:
1038
754
          case WS_WSS:
1039
            /* finished proto parsing */
1040
754
            vb->transport.len=tmp-vb->transport.s;
1041
754
            vb->proto=PROTO_WS;
1042
754
            state=F_HOST; /* start looking for host*/
1043
754
            goto main_via;
1044
523
          case FIN_WSS:
1045
            /* finished proto parsing */
1046
523
            vb->transport.len=tmp-vb->transport.s;
1047
523
            vb->proto=PROTO_WSS;
1048
523
            state=F_HOST; /* start looking for host*/
1049
523
            goto main_via;
1050
154k
          case OTHER_PROTO:
1051
            /* finished proto parsing */
1052
154k
            vb->transport.len=tmp-vb->transport.s;
1053
154k
            vb->proto=PROTO_OTHER;
1054
154k
            state=F_HOST; /* start looking for host*/
1055
154k
            goto main_via;
1056
1.98k
          case FIN_SIP:
1057
1.98k
            vb->name.len=tmp-vb->name.s;
1058
1.98k
            state=L_VER;
1059
1.98k
            break;
1060
2.29k
          case FIN_VER:
1061
2.29k
            vb->version.len=tmp-vb->version.s;
1062
2.29k
            state=L_PROTO;
1063
2.29k
            break;
1064
2.83k
          case F_LF:
1065
3.62k
          case F_CRLF:
1066
6.12k
          case F_CR: /* header continues on this line */
1067
6.12k
            state=saved_state;
1068
6.12k
            break;
1069
8
          default:
1070
8
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1071
8
            goto parse_error;
1072
175k
        }
1073
17.9k
        break;
1074
17.9k
      case '\n':
1075
8.15k
        switch(state){
1076
414
          case L_VER:
1077
971
          case F_SIP:
1078
1.36k
          case F_VER:
1079
1.77k
          case F_PROTO:
1080
2.17k
          case L_PROTO:
1081
2.17k
            saved_state=state;
1082
2.17k
            state=F_LF;
1083
2.17k
            break;
1084
438
          case FIN_UDP:
1085
438
            vb->transport.len=tmp-vb->transport.s;
1086
438
            vb->proto=PROTO_UDP;
1087
438
            state=F_LF;
1088
438
            saved_state=F_HOST; /* start looking for host*/
1089
438
            goto main_via;
1090
388
          case FIN_TCP:
1091
388
            vb->transport.len=tmp-vb->transport.s;
1092
388
            vb->proto=PROTO_TCP;
1093
388
            state=F_LF;
1094
388
            saved_state=F_HOST; /* start looking for host*/
1095
388
            goto main_via;
1096
294
          case FIN_TLS:
1097
294
            vb->transport.len=tmp-vb->transport.s;
1098
294
            vb->proto=PROTO_TLS;
1099
294
            state=F_LF;
1100
294
            saved_state=F_HOST; /* start looking for host*/
1101
294
            goto main_via;
1102
661
          case WS_WSS:
1103
661
          case FIN_WS:
1104
661
            vb->transport.len=tmp-vb->transport.s;
1105
661
            vb->proto=PROTO_WS;
1106
661
            state=F_LF;
1107
661
            saved_state=F_HOST; /* start looking for host*/
1108
661
            goto main_via;
1109
624
          case FIN_WSS:
1110
624
            vb->transport.len=tmp-vb->transport.s;
1111
624
            vb->proto=PROTO_WS;
1112
624
            state=F_LF;
1113
624
            saved_state=F_HOST; /* start looking for host*/
1114
624
            goto main_via;
1115
2.00k
          case OTHER_PROTO:
1116
            /* finished proto parsing */
1117
2.00k
            vb->transport.len=tmp-vb->transport.s;
1118
2.00k
            vb->proto=PROTO_OTHER;
1119
2.00k
            state=F_LF;
1120
2.00k
            saved_state=F_HOST; /* start looking for host*/
1121
2.00k
            goto main_via;
1122
268
          case FIN_SIP:
1123
268
            vb->name.len=tmp-vb->name.s;
1124
268
            state=F_LF;
1125
268
            saved_state=L_VER;
1126
268
            break;
1127
487
          case FIN_VER:
1128
487
            vb->version.len=tmp-vb->version.s;
1129
487
            state=F_LF;
1130
487
            saved_state=L_PROTO;
1131
487
            break;
1132
808
          case F_CR:
1133
808
            state=F_CRLF;
1134
808
            break;
1135
2
          case F_LF:
1136
4
          case F_CRLF:
1137
4
            state=saved_state;
1138
4
            goto endofheader;
1139
9
          default:
1140
9
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1141
9
            goto parse_error;
1142
8.15k
        }
1143
3.73k
        break;
1144
7.83k
      case '\r':
1145
7.83k
        switch(state){
1146
445
          case L_VER:
1147
1.22k
          case F_SIP:
1148
1.75k
          case F_VER:
1149
2.16k
          case F_PROTO:
1150
2.55k
          case L_PROTO:
1151
2.55k
            saved_state=state;
1152
2.55k
            state=F_CR;
1153
2.55k
            break;
1154
388
          case FIN_UDP:
1155
388
            vb->transport.len=tmp-vb->transport.s;
1156
388
            vb->proto=PROTO_UDP;
1157
388
            state=F_CR;
1158
388
            saved_state=F_HOST;
1159
388
            goto main_via;
1160
390
          case FIN_TCP:
1161
390
            vb->transport.len=tmp-vb->transport.s;
1162
390
            vb->proto=PROTO_TCP;
1163
390
            state=F_CR;
1164
390
            saved_state=F_HOST;
1165
390
            goto main_via;
1166
498
          case FIN_TLS:
1167
498
            vb->transport.len=tmp-vb->transport.s;
1168
498
            vb->proto=PROTO_TLS;
1169
498
            state=F_CR;
1170
498
            saved_state=F_HOST;
1171
498
            goto main_via;
1172
391
          case WS_WSS:
1173
391
          case FIN_WS:
1174
391
            vb->transport.len=tmp-vb->transport.s;
1175
391
            vb->proto=PROTO_WS;
1176
391
            state=F_CR;
1177
391
            saved_state=F_HOST;
1178
391
            goto main_via;
1179
390
          case FIN_WSS:
1180
390
            vb->transport.len=tmp-vb->transport.s;
1181
390
            vb->proto=PROTO_WSS;
1182
390
            state=F_CR;
1183
390
            saved_state=F_HOST;
1184
390
            goto main_via;
1185
2.35k
          case OTHER_PROTO:
1186
2.35k
            vb->transport.len=tmp-vb->transport.s;
1187
2.35k
            vb->proto=PROTO_OTHER;
1188
2.35k
            state=F_CR;
1189
2.35k
            saved_state=F_HOST;
1190
2.35k
            goto main_via;
1191
433
          case FIN_SIP:
1192
433
            vb->name.len=tmp-vb->name.s;
1193
433
            state=F_CR;
1194
433
            saved_state=L_VER;
1195
433
            break;
1196
413
          case FIN_VER:
1197
413
            vb->version.len=tmp-vb->version.s;
1198
413
            state=F_CR;
1199
413
            saved_state=L_PROTO;
1200
413
            break;
1201
4
          case F_LF: /*end of line ?next header?*/
1202
13
          case F_CR:
1203
17
          case F_CRLF:
1204
17
            state=saved_state;
1205
17
            goto endofheader;
1206
7
          default:
1207
7
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1208
7
            goto parse_error;
1209
7.83k
        }
1210
3.39k
        break;
1211
1212
339k
      case '/':
1213
339k
        switch(state){
1214
167k
          case FIN_SIP:
1215
167k
            vb->name.len=tmp-vb->name.s;
1216
167k
            state=F_VER;
1217
167k
            break;
1218
166k
          case FIN_VER:
1219
166k
            vb->version.len=tmp-vb->version.s;
1220
166k
            state=F_PROTO;
1221
166k
            break;
1222
2.60k
          case L_VER:
1223
2.60k
            state=F_VER;
1224
2.60k
            break;
1225
3.12k
          case L_PROTO:
1226
3.12k
            state=F_PROTO;
1227
3.12k
            break;
1228
146
          default:
1229
146
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1230
146
            goto parse_error;
1231
339k
        }
1232
339k
        break;
1233
        /* match SIP*/
1234
339k
      case 'S':
1235
280k
      case 's':
1236
280k
        switch(state){
1237
170k
          case F_SIP:
1238
170k
            state=SIP1;
1239
170k
            vb->name.s=tmp;
1240
170k
            break;
1241
7.07k
          case TLS2:
1242
7.07k
            state=FIN_TLS;
1243
7.07k
            break;
1244
29.1k
          case F_PROTO:
1245
29.1k
            state=SCTP1;
1246
29.1k
            vb->transport.s=tmp;
1247
29.1k
            break;
1248
18.1k
          case WS1:
1249
18.1k
            state=WS_WSS;
1250
18.1k
            break;
1251
8.02k
          case WS_WSS:
1252
8.02k
            state=FIN_WSS;
1253
8.02k
            break;
1254
38.5k
          case OTHER_PROTO:
1255
38.5k
            break;
1256
900
          case UDP1:
1257
1.44k
          case UDP2:
1258
1.85k
          case FIN_UDP:
1259
2.32k
          case TCP_TLS1:
1260
2.83k
          case TCP2:
1261
4.43k
          case FIN_TCP:
1262
4.84k
          case FIN_TLS:
1263
7.33k
          case SCTP1:
1264
7.87k
          case SCTP2:
1265
8.29k
          case SCTP3:
1266
8.82k
          case FIN_SCTP:
1267
8.82k
          case FIN_WS:
1268
9.30k
          case FIN_WSS:
1269
9.30k
            state=OTHER_PROTO;
1270
9.30k
            break;
1271
18
          default:
1272
18
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1273
18
            goto parse_error;
1274
280k
        }
1275
280k
        break;
1276
280k
      case 'I':
1277
208k
      case 'i':
1278
208k
        switch(state){
1279
169k
          case SIP1:
1280
169k
            state=SIP2;
1281
169k
            break;
1282
30.2k
          case OTHER_PROTO:
1283
30.2k
            break;
1284
520
          case UDP1:
1285
945
          case UDP2:
1286
1.88k
          case FIN_UDP:
1287
2.75k
          case TCP_TLS1:
1288
3.04k
          case TCP2:
1289
3.43k
          case FIN_TCP:
1290
3.83k
          case TLS2:
1291
4.42k
          case FIN_TLS:
1292
4.90k
          case SCTP1:
1293
5.69k
          case SCTP2:
1294
6.08k
          case SCTP3:
1295
6.47k
          case FIN_SCTP:
1296
7.35k
          case WS1:
1297
8.06k
          case WS_WSS:
1298
8.06k
          case FIN_WS:
1299
8.45k
          case FIN_WSS:
1300
8.45k
            state=OTHER_PROTO;
1301
8.45k
            break;
1302
27
          default:
1303
27
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1304
27
            goto parse_error;
1305
208k
        }
1306
208k
        break;
1307
208k
      case 'p':
1308
240k
      case 'P':
1309
240k
        switch(state){
1310
169k
          case SIP2:
1311
169k
            state=FIN_SIP;
1312
169k
            break;
1313
          /* allow p in PROTO */
1314
8.16k
          case UDP2:
1315
8.16k
            state=FIN_UDP;
1316
8.16k
            break;
1317
8.95k
          case TCP2:
1318
8.95k
            state=FIN_TCP;
1319
8.95k
            break;
1320
6.82k
          case SCTP3:
1321
6.82k
            state=FIN_SCTP;
1322
6.82k
            break;
1323
40.3k
          case OTHER_PROTO:
1324
40.3k
            break;
1325
799
          case UDP1:
1326
1.20k
          case FIN_UDP:
1327
1.80k
          case TCP_TLS1:
1328
2.20k
          case FIN_TCP:
1329
2.66k
          case TLS2:
1330
3.07k
          case FIN_TLS:
1331
3.70k
          case SCTP1:
1332
4.20k
          case SCTP2:
1333
4.60k
          case FIN_SCTP:
1334
5.22k
          case WS1:
1335
6.26k
          case WS_WSS:
1336
6.26k
          case FIN_WS:
1337
6.70k
          case FIN_WSS:
1338
6.70k
            state=OTHER_PROTO;
1339
6.70k
            break;
1340
20
          default:
1341
20
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1342
20
            goto parse_error;
1343
240k
        }
1344
240k
        break;
1345
240k
      case 'U':
1346
54.8k
      case 'u':
1347
54.8k
        switch(state){
1348
22.6k
          case F_PROTO:
1349
22.6k
            state=UDP1;
1350
22.6k
            vb->transport.s=tmp;
1351
22.6k
            break;
1352
24.3k
          case OTHER_PROTO:
1353
24.3k
            break;
1354
599
          case UDP1:
1355
999
          case UDP2:
1356
1.49k
          case FIN_UDP:
1357
2.32k
          case TCP_TLS1:
1358
2.76k
          case TCP2:
1359
3.16k
          case FIN_TCP:
1360
3.80k
          case TLS2:
1361
4.22k
          case FIN_TLS:
1362
5.00k
          case SCTP1:
1363
5.49k
          case SCTP2:
1364
5.89k
          case SCTP3:
1365
6.40k
          case FIN_SCTP:
1366
6.94k
          case WS1:
1367
7.40k
          case WS_WSS:
1368
7.40k
          case FIN_WS:
1369
7.88k
          case FIN_WSS:
1370
7.88k
            state=OTHER_PROTO;
1371
7.88k
            break;
1372
9
          default:
1373
9
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1374
9
            goto parse_error;
1375
54.8k
        }
1376
54.8k
        break;
1377
54.8k
      case 'D':
1378
48.8k
      case 'd':
1379
48.8k
        switch(state){
1380
14.1k
          case UDP1:
1381
14.1k
            state=UDP2;
1382
14.1k
            break;
1383
28.2k
          case OTHER_PROTO:
1384
28.2k
            break;
1385
541
          case UDP2:
1386
998
          case FIN_UDP:
1387
1.54k
          case TCP_TLS1:
1388
1.94k
          case TCP2:
1389
2.60k
          case FIN_TCP:
1390
2.99k
          case TLS2:
1391
3.38k
          case FIN_TLS:
1392
3.86k
          case SCTP1:
1393
4.41k
          case SCTP2:
1394
4.67k
          case SCTP3:
1395
5.09k
          case FIN_SCTP:
1396
5.57k
          case WS1:
1397
6.01k
          case WS_WSS:
1398
6.01k
          case FIN_WS:
1399
6.40k
          case FIN_WSS:
1400
6.40k
            state=OTHER_PROTO;
1401
6.40k
            break;
1402
10
          default:
1403
10
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1404
10
            goto parse_error;
1405
48.8k
        }
1406
48.8k
        break;
1407
48.8k
      case 'T':
1408
98.6k
      case 't':
1409
98.6k
        switch(state){
1410
37.5k
          case F_PROTO:
1411
37.5k
            state=TCP_TLS1;
1412
37.5k
            vb->transport.s=tmp;
1413
37.5k
            break;
1414
11.9k
          case SCTP2:
1415
11.9k
            state=SCTP3;
1416
11.9k
            break;
1417
41.5k
          case OTHER_PROTO:
1418
41.5k
            break;
1419
522
          case UDP1:
1420
994
          case UDP2:
1421
1.38k
          case FIN_UDP:
1422
1.90k
          case TCP_TLS1:
1423
2.45k
          case TCP2:
1424
2.84k
          case FIN_TCP:
1425
3.24k
          case TLS2:
1426
3.65k
          case FIN_TLS:
1427
4.73k
          case SCTP1:
1428
5.19k
          case SCTP3:
1429
5.58k
          case FIN_SCTP:
1430
6.02k
          case WS1:
1431
7.21k
          case WS_WSS:
1432
7.21k
          case FIN_WS:
1433
7.61k
          case FIN_WSS:
1434
7.61k
            state=OTHER_PROTO;
1435
7.61k
            break;
1436
11
          default:
1437
11
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1438
11
            goto parse_error;
1439
98.6k
        }
1440
98.6k
        break;
1441
98.6k
      case 'C':
1442
71.9k
      case 'c':
1443
71.9k
        switch(state){
1444
14.5k
          case TCP_TLS1:
1445
14.5k
            state=TCP2;
1446
14.5k
            break;
1447
19.1k
          case SCTP1:
1448
19.1k
            state=SCTP2;
1449
19.1k
            break;
1450
31.0k
          case OTHER_PROTO:
1451
31.0k
            break;
1452
696
          case UDP1:
1453
1.13k
          case UDP2:
1454
1.57k
          case FIN_UDP:
1455
2.00k
          case TCP2:
1456
2.41k
          case FIN_TCP:
1457
2.86k
          case TLS2:
1458
3.28k
          case FIN_TLS:
1459
3.89k
          case SCTP2:
1460
4.32k
          case SCTP3:
1461
4.73k
          case FIN_SCTP:
1462
6.07k
          case WS1:
1463
6.70k
          case WS_WSS:
1464
6.70k
          case FIN_WS:
1465
7.22k
          case FIN_WSS:
1466
7.22k
            state=OTHER_PROTO;
1467
7.22k
            break;
1468
12
          default:
1469
12
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1470
12
            goto parse_error;
1471
71.9k
        }
1472
71.9k
        break;
1473
71.9k
      case 'L':
1474
43.9k
      case 'l':
1475
43.9k
        switch(state){
1476
14.2k
          case TCP_TLS1:
1477
14.2k
            state=TLS2;
1478
14.2k
            break;
1479
22.7k
          case OTHER_PROTO:
1480
22.7k
            break;
1481
435
          case UDP1:
1482
872
          case UDP2:
1483
1.38k
          case FIN_UDP:
1484
1.88k
          case TCP2:
1485
2.37k
          case FIN_TCP:
1486
3.48k
          case TLS2:
1487
3.87k
          case FIN_TLS:
1488
4.38k
          case SCTP1:
1489
4.77k
          case SCTP2:
1490
5.21k
          case SCTP3:
1491
5.62k
          case FIN_SCTP:
1492
6.05k
          case WS1:
1493
6.46k
          case WS_WSS:
1494
6.46k
          case FIN_WS:
1495
6.85k
          case FIN_WSS:
1496
6.85k
            state=OTHER_PROTO;
1497
6.85k
            break;
1498
11
          default:
1499
11
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1500
11
            goto parse_error;
1501
43.9k
        }
1502
43.8k
        break;
1503
43.8k
      case 'W':
1504
61.9k
      case 'w':
1505
61.9k
        switch(state){
1506
27.3k
          case F_PROTO:
1507
27.3k
            state=WS1;
1508
27.3k
            vb->transport.s=tmp;
1509
27.3k
            break;
1510
23.6k
          case OTHER_PROTO:
1511
23.6k
            break;
1512
853
          case UDP1:
1513
1.30k
          case UDP2:
1514
1.69k
          case FIN_UDP:
1515
3.77k
          case TCP_TLS1:
1516
4.22k
          case TCP2:
1517
4.65k
          case FIN_TCP:
1518
5.37k
          case TLS2:
1519
5.77k
          case FIN_TLS:
1520
6.27k
          case SCTP1:
1521
7.03k
          case SCTP2:
1522
7.43k
          case SCTP3:
1523
7.83k
          case FIN_SCTP:
1524
9.44k
          case WS1:
1525
10.1k
          case WS_WSS:
1526
10.1k
          case FIN_WS:
1527
10.9k
          case FIN_WSS:
1528
10.9k
            state=OTHER_PROTO;
1529
10.9k
            break;
1530
9
          default:
1531
9
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1532
9
            goto parse_error;
1533
61.9k
        }
1534
61.9k
        break;
1535
      /*match 2.0*/
1536
187k
      case '2':
1537
187k
        switch(state){
1538
169k
          case F_VER:
1539
169k
            state=VER1;
1540
169k
            vb->version.s=tmp;
1541
169k
            break;
1542
10.8k
          case OTHER_PROTO:
1543
10.8k
            break;
1544
465
          case UDP1:
1545
873
          case UDP2:
1546
1.26k
          case FIN_UDP:
1547
1.83k
          case TCP_TLS1:
1548
2.22k
          case TCP2:
1549
2.80k
          case FIN_TCP:
1550
3.06k
          case TLS2:
1551
3.45k
          case FIN_TLS:
1552
3.98k
          case SCTP1:
1553
4.44k
          case SCTP2:
1554
4.84k
          case SCTP3:
1555
5.24k
          case FIN_SCTP:
1556
5.71k
          case WS1:
1557
6.20k
          case WS_WSS:
1558
6.20k
          case FIN_WS:
1559
6.60k
          case FIN_WSS:
1560
6.60k
            state=OTHER_PROTO;
1561
6.60k
            break;
1562
24
          default:
1563
24
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1564
24
            goto parse_error;
1565
187k
        }
1566
187k
        break;
1567
192k
      case '.':
1568
192k
        switch(state){
1569
169k
          case VER1:
1570
169k
            state=VER2;
1571
169k
            break;
1572
14.0k
          case OTHER_PROTO:
1573
14.0k
            break;
1574
679
          case UDP1:
1575
1.22k
          case UDP2:
1576
1.74k
          case FIN_UDP:
1577
2.38k
          case TCP_TLS1:
1578
2.77k
          case TCP2:
1579
3.61k
          case FIN_TCP:
1580
4.73k
          case TLS2:
1581
5.14k
          case FIN_TLS:
1582
5.92k
          case SCTP1:
1583
6.36k
          case SCTP2:
1584
6.66k
          case SCTP3:
1585
7.06k
          case FIN_SCTP:
1586
7.73k
          case WS1:
1587
8.18k
          case WS_WSS:
1588
8.18k
          case FIN_WS:
1589
8.64k
          case FIN_WSS:
1590
8.64k
            state=OTHER_PROTO;
1591
8.64k
            break;
1592
14
          default:
1593
14
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1594
14
            goto parse_error;
1595
192k
        }
1596
192k
         break;
1597
196k
      case '0':
1598
196k
        switch(state){
1599
169k
          case VER2:
1600
169k
            state=FIN_VER;
1601
169k
            break;
1602
19.6k
          case OTHER_PROTO:
1603
19.6k
            break;
1604
567
          case UDP1:
1605
1.00k
          case UDP2:
1606
1.32k
          case FIN_UDP:
1607
1.82k
          case TCP_TLS1:
1608
2.23k
          case TCP2:
1609
2.51k
          case FIN_TCP:
1610
2.90k
          case TLS2:
1611
3.37k
          case FIN_TLS:
1612
3.84k
          case SCTP1:
1613
4.34k
          case SCTP2:
1614
4.76k
          case SCTP3:
1615
5.57k
          case FIN_SCTP:
1616
5.99k
          case WS1:
1617
6.54k
          case WS_WSS:
1618
6.54k
          case FIN_WS:
1619
7.10k
          case FIN_WSS:
1620
7.10k
            state=OTHER_PROTO;
1621
7.10k
            break;
1622
18
          default:
1623
18
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1624
18
            goto parse_error;
1625
196k
        }
1626
196k
        break;
1627
1628
1.06M
      default:
1629
1.06M
        switch(state){
1630
52.7k
          case F_PROTO:
1631
52.7k
            state=OTHER_PROTO;
1632
52.7k
            vb->transport.s=tmp;
1633
52.7k
            break;
1634
993k
          case OTHER_PROTO:
1635
993k
            break;
1636
1.44k
          case UDP1:
1637
2.32k
          case UDP2:
1638
3.00k
          case FIN_UDP:
1639
4.10k
          case TCP_TLS1:
1640
4.93k
          case TCP2:
1641
5.81k
          case FIN_TCP:
1642
6.66k
          case TLS2:
1643
7.26k
          case FIN_TLS:
1644
8.55k
          case SCTP1:
1645
9.66k
          case SCTP2:
1646
10.5k
          case SCTP3:
1647
11.4k
          case FIN_SCTP:
1648
12.7k
          case WS1:
1649
13.9k
          case WS_WSS:
1650
13.9k
          case FIN_WS:
1651
14.7k
          case FIN_WSS:
1652
14.7k
            state=OTHER_PROTO;
1653
14.7k
            break;
1654
276
          default:
1655
276
            LM_ERR("bad char <%c> on state %d\n", *tmp, state);
1656
276
            goto parse_error;
1657
1.06M
        }
1658
1.06M
        break;
1659
3.27M
    }
1660
3.27M
  } /* for tmp*/
1661
1662
  /* we should not be here! if everything is ok > main_via*/
1663
2.92k
  LM_ERR("bad via: end of packet on state=%d\n", state);
1664
2.92k
  goto parse_error;
1665
1666
166k
 main_via:
1667
  /* inc tmp to point to the next char*/
1668
166k
  tmp++;
1669
166k
  c_nest=0;
1670
166k
  /*state should always be F_HOST here*/;
1671
4.76M
  for(;tmp<end;tmp++){
1672
4.75M
    switch(*tmp){
1673
53.8k
    case ' ':
1674
76.8k
    case '\t':
1675
76.8k
      switch(state){
1676
29.2k
          case F_HOST:/*eat the spaces*/
1677
29.2k
            break;
1678
4.72k
          case P_HOST:
1679
             /*mark end of host*/
1680
4.72k
             vb->host.len=tmp-vb->host.s;
1681
4.72k
             state=L_PORT;
1682
4.72k
             break;
1683
1.15k
          case L_PORT: /*eat the spaces*/
1684
2.30k
          case F_PORT:
1685
2.30k
            break;
1686
937
          case P_PORT:
1687
            /*end of port */
1688
937
            vb->port_str.len=tmp-vb->port_str.s;
1689
937
            state=L_PARAM;
1690
937
            break;
1691
2.25k
          case L_PARAM: /* eat the space */
1692
4.14k
          case F_PARAM:
1693
4.14k
            break;
1694
0
          case P_PARAM:
1695
          /*  *tmp=0;*/ /*!?end of param*/
1696
0
            state=L_PARAM;
1697
0
            break;
1698
1.46k
          case L_VIA:
1699
2.39k
          case F_VIA: /* eat the space */
1700
2.39k
            break;
1701
973
          case F_COMMENT:
1702
7.65k
          case P_COMMENT:
1703
7.65k
            break;
1704
3
          case F_IP6HOST: /*no spaces allowed*/
1705
5
          case P_IP6HOST:
1706
5
            LM_ERR("bad ipv6 reference\n");
1707
5
            goto parse_error;
1708
2.37k
          case F_CRLF:
1709
13.9k
          case F_LF:
1710
25.4k
          case F_CR:
1711
            /*previous=crlf and now =' '*/
1712
25.4k
            state=saved_state;
1713
25.4k
            break;
1714
0
          default:
1715
0
            LM_ERR("on <%c>, state=%d\n",*tmp, state);
1716
0
            goto parse_error;
1717
76.8k
        }
1718
76.8k
      break;
1719
107k
      case '\n':
1720
107k
        switch(state){
1721
577
          case F_HOST:/*eat the spaces*/
1722
3.59k
          case L_PORT: /*eat the spaces*/
1723
3.98k
          case F_PORT:
1724
5.63k
          case L_PARAM: /* eat the space */
1725
6.39k
          case F_PARAM:
1726
6.81k
          case F_VIA: /* eat the space */
1727
8.91k
          case L_VIA:
1728
9.32k
          case F_COMMENT:
1729
9.98k
          case P_COMMENT:
1730
10.4k
          case F_IP6HOST:
1731
10.8k
          case P_IP6HOST:
1732
10.8k
            saved_state=state;
1733
10.8k
            state=F_LF;
1734
10.8k
            break;
1735
87.4k
          case P_HOST:
1736
             /*mark end of host*/
1737
87.4k
             vb->host.len=tmp-vb->host.s;
1738
87.4k
             saved_state=L_PORT;
1739
87.4k
             state=F_LF;
1740
87.4k
             break;
1741
1.38k
          case P_PORT:
1742
            /*end of port */
1743
1.38k
            vb->port_str.len=tmp-vb->port_str.s;
1744
1.38k
            saved_state=L_PARAM;
1745
1.38k
            state=F_LF;
1746
1.38k
            break;
1747
0
          case P_PARAM:
1748
          /*  *tmp=0;*/ /*!?end of param*/
1749
0
            saved_state=L_PARAM;
1750
0
            state=F_LF;
1751
0
            break;
1752
7.94k
          case F_CR:
1753
7.94k
            state=F_CRLF;
1754
7.94k
            break;
1755
6
          case F_CRLF:
1756
259
          case F_LF:
1757
259
            state=saved_state;
1758
259
            goto endofheader;
1759
0
          default:
1760
0
            LM_CRIT("BUG on <%c>\n",*tmp);
1761
0
            goto  parse_error;
1762
107k
        }
1763
107k
      break;
1764
107k
    case '\r':
1765
23.8k
        switch(state){
1766
952
          case F_HOST:/*eat the spaces*/
1767
2.12k
          case L_PORT: /*eat the spaces*/
1768
2.59k
          case F_PORT:
1769
3.13k
          case L_PARAM: /* eat the space */
1770
3.67k
          case F_PARAM:
1771
4.07k
          case F_VIA: /* eat the space */
1772
5.34k
          case L_VIA:
1773
5.74k
          case F_COMMENT:
1774
7.15k
          case P_COMMENT:
1775
7.57k
          case F_IP6HOST:
1776
8.22k
          case P_IP6HOST:
1777
8.22k
            saved_state=state;
1778
8.22k
            state=F_CR;
1779
8.22k
            break;
1780
14.4k
          case P_HOST:
1781
             /*mark end of host*/
1782
14.4k
             vb->host.len=tmp-vb->host.s;
1783
14.4k
             saved_state=L_PORT;
1784
14.4k
             state=F_CR;
1785
14.4k
             break;
1786
671
          case P_PORT:
1787
            /*end of port */
1788
671
            vb->port_str.len=tmp-vb->port_str.s;
1789
671
            saved_state=L_PARAM;
1790
671
            state=F_CR;
1791
671
            break;
1792
0
          case P_PARAM:
1793
          /*  *tmp=0;*/ /*!?end of param*/
1794
0
            saved_state=L_PARAM;
1795
0
            state=F_CR;
1796
0
            break;
1797
2
          case F_CRLF:
1798
391
          case F_CR:
1799
483
          case F_LF:
1800
483
            state=saved_state;
1801
483
            goto endofheader;
1802
0
          default:
1803
0
            LM_ERR("on <%c>\n",*tmp);
1804
0
            goto parse_error;
1805
23.8k
        }
1806
23.3k
      break;
1807
1808
26.1k
      case ':':
1809
26.1k
        switch(state){
1810
674
          case F_IP6HOST:
1811
674
            state=P_IP6HOST;
1812
674
            break;
1813
689
          case P_IP6HOST:
1814
689
            break;
1815
4.80k
          case P_HOST:
1816
            /*mark  end of host*/
1817
4.80k
            vb->host.len=tmp-vb->host.s;
1818
4.80k
            state=F_PORT;
1819
4.80k
            break;
1820
1.20k
          case L_PORT:
1821
1.20k
            state=F_PORT;
1822
1.20k
            break;
1823
3
          case P_PORT:
1824
3
            LM_ERR("bad port\n");
1825
3
            goto parse_error;
1826
4
          case L_PARAM:
1827
7
          case F_PARAM:
1828
7
          case P_PARAM:
1829
7
            LM_ERR("bad char <%c> in state %d\n",
1830
7
              *tmp,state);
1831
7
            goto parse_error;
1832
2
          case L_VIA:
1833
4
          case F_VIA:
1834
4
            LM_ERR("bad char in compact via\n");
1835
4
            goto parse_error;
1836
775
          case F_CRLF:
1837
4.38k
          case F_LF:
1838
5.42k
          case F_CR:
1839
            /*previous=crlf and now !=' '*/
1840
5.42k
            goto endofheader;
1841
1.13k
          case F_COMMENT:/*everything is allowed in a comment*/
1842
1.13k
            vb->comment.s=tmp;
1843
1.13k
            state=P_COMMENT;
1844
1.13k
            break;
1845
12.2k
          case P_COMMENT: /*everything is allowed in a comment*/
1846
12.2k
            break;
1847
10
          default:
1848
10
            LM_ERR("on <%c> state %d\n", *tmp, state);
1849
10
            goto parse_error;
1850
26.1k
        }
1851
20.7k
        break;
1852
43.0k
      case ';':
1853
43.0k
        switch(state){
1854
6
          case F_HOST:
1855
8
          case F_IP6HOST:
1856
8
            LM_ERR(" no host found\n");
1857
8
            goto parse_error;
1858
3
          case P_IP6HOST:
1859
3
            LM_ERR(" bad ipv6 reference\n");
1860
3
            goto parse_error;
1861
28.0k
          case P_HOST:
1862
28.0k
            vb->host.len=tmp-vb->host.s;
1863
28.0k
            state=F_PARAM;
1864
28.0k
            param_start=tmp+1;
1865
28.0k
            break;
1866
1.31k
          case P_PORT:
1867
            /*mark the end*/
1868
1.31k
            vb->port_str.len=tmp-vb->port_str.s;
1869
            /* fall through */
1870
2.78k
          case L_PORT:
1871
8.46k
          case L_PARAM:
1872
8.46k
            state=F_PARAM;
1873
8.46k
            param_start=tmp+1;
1874
8.46k
            break;
1875
4
          case F_PORT:
1876
4
            LM_ERR(" bad char <%c> in state %d\n",
1877
4
              *tmp,state);
1878
4
            goto parse_error;
1879
9
          case F_PARAM:
1880
9
            LM_ERR("null param?\n");
1881
9
            goto parse_error;
1882
0
          case P_PARAM:
1883
            /*hmm next, param?*/
1884
0
            state=F_PARAM;
1885
0
            param_start=tmp+1;
1886
0
            break;
1887
2
          case L_VIA:
1888
6
          case F_VIA:
1889
6
            LM_ERR("bad char <%c> in next via\n", *tmp);
1890
6
            goto parse_error;
1891
414
          case F_CRLF:
1892
1.19k
          case F_LF:
1893
1.79k
          case F_CR:
1894
            /*previous=crlf and now !=' '*/
1895
1.79k
            goto endofheader;
1896
415
          case F_COMMENT:/*everything is allowed in a comment*/
1897
415
            vb->comment.s=tmp;
1898
415
            state=P_COMMENT;
1899
415
            break;
1900
4.22k
          case P_COMMENT: /*everything is allowed in a comment*/
1901
4.22k
            break;
1902
1903
0
          default:
1904
0
            LM_ERR("on <%c> state %d\n", *tmp, state);
1905
0
            goto parse_error;
1906
43.0k
        }
1907
41.2k
      break;
1908
41.2k
      case ',':
1909
37.1k
        switch(state){
1910
4
          case F_HOST:
1911
6
          case F_IP6HOST:
1912
6
            LM_ERR("no host found\n");
1913
6
            goto parse_error;
1914
3
          case P_IP6HOST:
1915
3
            LM_ERR(" bad ipv6 reference\n");
1916
3
            goto parse_error;
1917
13.1k
          case P_HOST:
1918
            /*mark the end*/
1919
13.1k
            vb->host.len=tmp-vb->host.s;
1920
13.1k
            state=F_VIA;
1921
13.1k
            break;
1922
786
          case P_PORT:
1923
            /*mark the end*/
1924
786
            vb->port_str.len=tmp-vb->port_str.s;
1925
786
            state=F_VIA;
1926
786
            break;
1927
414
          case L_PORT:
1928
895
          case L_PARAM:
1929
895
          case P_PARAM:
1930
1.56k
          case L_VIA:
1931
1.56k
            state=F_VIA;
1932
1.56k
            break;
1933
2
          case F_PORT:
1934
6
          case F_PARAM:
1935
6
            LM_ERR("invalid char <%c> in state %d\n", *tmp,state);
1936
6
            goto parse_error;
1937
1.53k
          case F_VIA:
1938
            /* do  nothing,  eat ","*/
1939
1.53k
            break;
1940
424
          case F_CRLF:
1941
1.09k
          case F_LF:
1942
4.87k
          case F_CR:
1943
            /*previous=crlf and now !=' '*/
1944
4.87k
            goto endofheader;
1945
1.05k
          case F_COMMENT:/*everything is allowed in a comment*/
1946
1.05k
            vb->comment.s=tmp;
1947
1.05k
            state=P_COMMENT;
1948
1.05k
            break;
1949
14.2k
          case P_COMMENT: /*everything is allowed in a comment*/
1950
14.2k
            break;
1951
0
          default:
1952
0
            LM_ERR("on <%c> state %d\n",*tmp, state);
1953
0
            goto  parse_error;
1954
37.1k
        }
1955
32.2k
      break;
1956
3.33M
      case '(':
1957
3.33M
        switch(state){
1958
2
          case F_HOST:
1959
4
          case F_PORT:
1960
8
          case F_PARAM:
1961
10
          case F_VIA:
1962
12
          case F_IP6HOST:
1963
15
          case P_IP6HOST: /*must be terminated in ']'*/
1964
15
            LM_ERR(" on <%c> state %d\n", *tmp, state);
1965
15
            goto  parse_error;
1966
1.82k
          case P_HOST:
1967
            /*mark the end*/
1968
1.82k
            vb->host.len=tmp-vb->host.s;
1969
1.82k
            state=F_COMMENT;
1970
1.82k
            c_nest++;
1971
1.82k
            break;
1972
755
          case P_PORT:
1973
            /*mark the end*/
1974
755
            vb->port_str.len=tmp-vb->port_str.s;
1975
755
            state=F_COMMENT;
1976
755
            c_nest++;
1977
755
            break;
1978
0
          case P_PARAM:
1979
            /*mark the end*/
1980
0
            vb->params.len=tmp-vb->params.s;
1981
0
            state=F_COMMENT;
1982
0
            c_nest++;
1983
0
            break;
1984
714
          case L_PORT:
1985
1.11k
          case L_PARAM:
1986
5.37k
          case L_VIA:
1987
5.37k
            state=F_COMMENT;
1988
5.37k
            vb->params.len=tmp-vb->params.s;
1989
5.37k
            c_nest++;
1990
5.37k
            break;
1991
3.32M
          case P_COMMENT:
1992
3.32M
          case F_COMMENT:
1993
3.32M
            c_nest++;
1994
3.32M
            break;
1995
548
          case F_CRLF:
1996
1.61k
          case F_LF:
1997
2.64k
          case F_CR:
1998
            /*previous=crlf and now !=' '*/
1999
2.64k
            goto endofheader;
2000
0
          default:
2001
0
            LM_ERR("on <%c> state %d\n", *tmp, state);
2002
0
            goto  parse_error;
2003
3.33M
        }
2004
3.33M
      break;
2005
3.33M
      case ')':
2006
57.0k
        switch(state){
2007
2.61k
          case F_COMMENT:
2008
54.7k
          case P_COMMENT:
2009
54.7k
            if (c_nest){
2010
54.7k
              c_nest--;
2011
54.7k
              if(c_nest==0){
2012
7.54k
                state=L_VIA;
2013
7.54k
                vb->comment.len=tmp-vb->comment.s;
2014
7.54k
                break;
2015
7.54k
              }
2016
54.7k
            }else{
2017
0
              LM_ERR(" missing '(' - nesting= %d\n", c_nest);
2018
0
               goto parse_error;
2019
0
            }
2020
47.1k
            break;
2021
47.1k
          case F_HOST:
2022
6
          case F_PORT:
2023
8
          case F_PARAM:
2024
11
          case F_VIA:
2025
13
          case P_HOST:
2026
15
          case P_PORT:
2027
15
          case P_PARAM:
2028
18
          case L_PORT:
2029
21
          case L_PARAM:
2030
25
          case L_VIA:
2031
27
          case F_IP6HOST:
2032
29
          case P_IP6HOST:
2033
29
            LM_ERR(" on <%c> state %d\n",*tmp, state);
2034
29
            goto  parse_error;
2035
543
          case F_CRLF:
2036
1.65k
          case F_LF:
2037
2.30k
          case F_CR:
2038
            /*previous=crlf and now !=' '*/
2039
2.30k
            goto endofheader;
2040
0
          default:
2041
0
            LM_ERR("on <%c> state %d\n", *tmp, state);
2042
0
            goto  parse_error;
2043
57.0k
        }
2044
54.7k
        break;
2045
54.7k
      case '[':
2046
5.10k
        switch(state){
2047
1.97k
          case F_HOST:
2048
1.97k
            vb->host.s=tmp; /* mark start here (include [])*/
2049
1.97k
            state=F_IP6HOST;
2050
1.97k
            break;
2051
453
          case F_COMMENT:/*everything is allowed in a comment*/
2052
453
            vb->comment.s=tmp;
2053
453
            state=P_COMMENT;
2054
453
            break;
2055
552
          case P_COMMENT:
2056
552
            break;
2057
450
          case F_CRLF:
2058
911
          case F_LF:
2059
2.11k
          case F_CR:
2060
            /*previous=crlf and now !=' '*/
2061
2.11k
            goto endofheader;
2062
3
          default:
2063
3
            LM_ERR("on <%c> state %d\n",*tmp, state);
2064
3
            goto  parse_error;
2065
5.10k
        }
2066
2.98k
        break;
2067
5.96k
      case ']':
2068
5.96k
        switch(state){
2069
1.77k
          case P_IP6HOST:
2070
            /*mark the end*/
2071
1.77k
            vb->host.len=(tmp-vb->host.s)+1; /* include "]" */
2072
1.77k
            state=L_PORT;
2073
1.77k
            break;
2074
432
          case F_CRLF:
2075
1.69k
          case F_LF:
2076
2.21k
          case F_CR:
2077
            /*previous=crlf and now !=' '*/
2078
2.21k
            goto endofheader;
2079
643
          case F_COMMENT:/*everything is allowed in a comment*/
2080
643
            vb->comment.s=tmp;
2081
643
            state=P_COMMENT;
2082
643
            break;
2083
1.34k
          case P_COMMENT:
2084
1.34k
            break;
2085
5
          default:
2086
5
            LM_ERR("on <%c> state %d\n",*tmp, state);
2087
5
            goto  parse_error;
2088
5.96k
        }
2089
3.75k
        break;
2090
164k
      case '\0':
2091
164k
        break;
2092
2093
865k
      default:
2094
865k
        switch(state){
2095
164k
          case F_HOST:
2096
164k
            state=P_HOST;
2097
164k
            vb->host.s=tmp;
2098
            //break;
2099
211k
          case P_HOST:
2100
            /*check if host allowed char*/
2101
211k
            if ( (*tmp<'a' || *tmp>'z') && (*tmp<'A' || *tmp>'Z')
2102
44.7k
            && (*tmp<'0' || *tmp>'9') && *tmp!='-' && *tmp!='.')
2103
145
              goto parse_error;
2104
210k
            break;
2105
210k
          case F_PORT:
2106
5.93k
            state=P_PORT;
2107
5.93k
            vb->port_str.s=tmp;
2108
            //break;
2109
9.95k
          case P_PORT:
2110
            /*check if number*/
2111
9.95k
            if ( *tmp<'0' || *tmp>'9' )
2112
47
              goto parse_error;
2113
9.91k
            break;
2114
132k
          case F_PARAM:
2115
132k
            /*state=P_PARAM*/;
2116
132k
            if(vb->params.s==0) vb->params.s=param_start;
2117
132k
            param=pkg_malloc(sizeof(struct via_param));
2118
132k
            if (param==0){
2119
0
              LM_ERR("no pkg memory left\n");
2120
0
              goto error;
2121
0
            }
2122
132k
            memset(param,0, sizeof(struct via_param));
2123
132k
            param->start=param_start;
2124
132k
            tmp=parse_via_param(tmp, end, &state, &saved_state,
2125
132k
                      param);
2126
2127
132k
            switch(state){
2128
96.2k
              case F_PARAM:
2129
96.2k
                param_start=tmp+1;
2130
98.7k
              case L_PARAM:
2131
100k
              case F_LF:
2132
104k
              case F_CR:
2133
104k
                vb->params.len=tmp - vb->params.s;
2134
104k
                break;
2135
3.14k
              case F_VIA:
2136
3.14k
                vb->params.len=param->start+param->size
2137
3.14k
                        -vb->params.s;
2138
3.14k
                break;
2139
22.6k
              case END_OF_HEADER:
2140
22.6k
                vb->params.len=param->start+param->size
2141
22.6k
                        -vb->params.s;
2142
22.6k
                break;
2143
2.01k
              case PARAM_ERROR:
2144
2.01k
                pkg_free(param);
2145
2.01k
                goto parse_error;
2146
0
              default:
2147
0
                pkg_free(param);
2148
0
                LM_ERR(" after parse_via_param: invalid "
2149
0
                    "char <%c> on state %d\n",*tmp, state);
2150
0
                goto parse_error;
2151
132k
            }
2152
            /*add param to the list*/
2153
130k
            if (vb->last_param)  vb->last_param->next=param;
2154
29.8k
            else        vb->param_lst=param;
2155
130k
            vb->last_param=param;
2156
            /* update param. shortcuts */
2157
130k
            switch(param->type){
2158
1.79k
              case PARAM_BRANCH:
2159
1.79k
                vb->branch=param;
2160
1.79k
                break;
2161
1.87k
              case PARAM_RECEIVED:
2162
1.87k
                vb->received=param;
2163
1.87k
                break;
2164
6.36k
              case PARAM_RPORT:
2165
6.36k
                vb->rport=param;
2166
6.36k
                break;
2167
2.49k
              case PARAM_I:
2168
2.49k
                vb->i=param;
2169
2.49k
                break;
2170
2.58k
              case PARAM_ALIAS:
2171
2.58k
                vb->alias=param;
2172
2.58k
                break;
2173
1.95k
              case PARAM_MADDR:
2174
1.95k
                vb->maddr=param;
2175
1.95k
                break;
2176
130k
            }
2177
2178
130k
            if (state==END_OF_HEADER){
2179
22.6k
              state=saved_state;
2180
22.6k
              goto endofheader;
2181
22.6k
            }
2182
107k
            break;
2183
107k
          case P_PARAM:
2184
0
            break;
2185
18.4k
          case F_VIA:
2186
            /*vb->next=tmp;*/ /*???*/
2187
18.4k
            goto nextvia;
2188
33
          case L_PORT:
2189
59
          case L_PARAM:
2190
75
          case L_VIA:
2191
75
            LM_ERR("on <%c> state %d (default)\n",*tmp, state);
2192
75
            goto  parse_error;
2193
1.93k
          case F_COMMENT:
2194
1.93k
            state=P_COMMENT;
2195
1.93k
            vb->comment.s=tmp;
2196
1.93k
            break;
2197
398k
          case P_COMMENT:
2198
398k
            break;
2199
1.26k
          case F_IP6HOST:
2200
1.26k
            state=P_IP6HOST;
2201
            //break;
2202
2.90k
          case P_IP6HOST:
2203
            /*check if host allowed char*/
2204
2.90k
            if ( (*tmp<'a' || *tmp>'f') && (*tmp<'A' || *tmp>'F')
2205
1.15k
            && (*tmp<'0' || *tmp>'9') && *tmp!=':')
2206
50
              goto parse_error;
2207
2.85k
            break;
2208
2.85k
          case F_CRLF:
2209
86.8k
          case F_LF:
2210
89.7k
          case F_CR:
2211
            /*previous=crlf and now !=' '*/
2212
89.7k
            goto endofheader;
2213
0
          default:
2214
0
            LM_ERR("invalid char <%c> in state %d\n",*tmp, state);
2215
0
            goto parse_error;
2216
865k
        }
2217
2218
2219
4.75M
    }
2220
4.75M
  }
2221
2222
11.3k
  LM_DBG("end of packet reached, state=%d\n", state);
2223
11.3k
  goto endofpacket; /*end of packet, probably should be goto error*/
2224
2225
134k
endofheader:
2226
134k
  state=saved_state;
2227
134k
  LM_DBG("end of header reached, state=%d\n", state);
2228
145k
endofpacket:
2229
  /* check if error*/
2230
145k
  switch(state){
2231
9.45k
    case P_HOST:
2232
113k
    case L_PORT:
2233
113k
    case P_PORT:
2234
141k
    case L_PARAM:
2235
141k
    case P_PARAM:
2236
141k
    case P_VALUE:
2237
141k
    case GEN_PARAM:
2238
141k
    case FIN_HIDDEN:
2239
144k
    case L_VIA:
2240
144k
      break;
2241
1.82k
    default:
2242
1.82k
      LM_ERR(" invalid via - end of header in state %d\n", state);
2243
1.82k
      goto parse_error;
2244
145k
  }
2245
2246
2247
  /*
2248
  if (proto) printf("<SIP/2.0/%s>\n", proto);
2249
  if (host) printf("host= <%s>\n", host);
2250
  if (port_str) printf("port= <%s>\n", port_str);
2251
  if (param) printf("params= <%s>\n", param);
2252
  if (comment) printf("comment= <%s>\n", comment);
2253
  if(next_via) printf("next_via= <%s>\n", next_via);
2254
  */
2255
  /*LM_DBG("rest=<%s>\n", tmp);*/
2256
2257
144k
  vb->error=PARSE_OK;
2258
144k
  vb->bsize=tmp-buffer;
2259
144k
  if (vb->port_str.s){
2260
4.59k
    vb->port=str2s(vb->port_str.s, vb->port_str.len, &err);
2261
4.59k
    if (err){
2262
9
          LM_ERR(" invalid port number <%.*s>\n",
2263
9
            vb->port_str.len, ZSW(vb->port_str.s));
2264
9
          goto parse_error;
2265
9
    }
2266
4.59k
  }
2267
143k
  return tmp;
2268
18.4k
nextvia:
2269
18.4k
  LM_DBG("next_via\n");
2270
18.4k
  vb->error=PARSE_OK;
2271
18.4k
  vb->bsize=tmp-buffer;
2272
18.4k
  if (vb->port_str.s){
2273
1.21k
    vb->port=str2s(vb->port_str.s, vb->port_str.len, &err);
2274
1.21k
    if (err){
2275
3
          LM_ERR(" invalid port number <%.*s>\n",
2276
3
            vb->port_str.len, ZSW(vb->port_str.s));
2277
3
          goto parse_error;
2278
3
    }
2279
1.21k
  }
2280
18.4k
  vb->next=pkg_malloc(sizeof(struct via_body));
2281
18.4k
  if (vb->next==0){
2282
0
    LM_ERR(" out of pkg memory\n");
2283
0
    goto error;
2284
0
  }
2285
18.4k
  vb=vb->next;
2286
18.4k
  memset(vb, 0, sizeof(struct via_body));
2287
18.4k
  buffer=tmp;
2288
18.4k
  goto parse_again;
2289
2290
7.84k
parse_error:
2291
7.84k
  if (end>buffer){
2292
7.84k
    LM_ERR(" <%.*s>\n", (int)(end-buffer), ZSW(buffer));
2293
7.84k
  }
2294
7.84k
  if ((tmp>buffer)&&(tmp<end)){
2295
1.42k
    LM_ERR("parsed so far:<%.*s>\n",
2296
1.42k
        (int)(tmp-buffer), ZSW(buffer) );
2297
6.41k
  }else{
2298
6.41k
    LM_ERR("via parse failed\n");
2299
6.41k
  }
2300
7.84k
error:
2301
7.84k
  vb->error=PARSE_ERROR;
2302
7.84k
  vbody->error=PARSE_ERROR; /* make sure the first via body is marked
2303
                 as bad also */
2304
7.84k
  return tmp;
2305
7.84k
}
2306
2307
2308
static inline void free_via_param_list(struct via_param* vp)
2309
29.8k
{
2310
29.8k
  struct via_param* foo;
2311
160k
  while(vp){
2312
130k
    foo=vp;
2313
130k
    vp=vp->next;
2314
130k
    pkg_free(foo);
2315
130k
  }
2316
29.8k
}
2317
2318
2319
void free_via_list(struct via_body* vb)
2320
151k
{
2321
151k
  struct via_body* foo;
2322
322k
  while(vb){
2323
170k
    foo=vb;
2324
170k
    vb=vb->next;
2325
170k
    if (foo->param_lst) free_via_param_list(foo->param_lst);
2326
170k
    pkg_free(foo);
2327
170k
  }
2328
151k
}