40
40
#define ARES_TOKENS ";=."
41
41
#define ARES_TOKENS2 "=."
42
42
43
- #define ARES_MAXTOKENS 512
43
+ #define ARES_MAXTOKENS 1024
44
44
45
45
/* tables */
46
46
struct lookup
@@ -337,35 +337,37 @@ ares_xconvert(struct lookup *table, int code)
337
337
}
338
338
339
339
/*
340
- ** ARES_DEDUP -- if we've gotten multiple results of the same method,
341
- ** discard the older one
340
+ ** ARES_METHOD_SEEN -- if we've already seen the results of the method,
341
+ ** returns its index
342
342
**
343
343
** Parameters:
344
344
** ar -- pointer to a (struct authres)
345
345
** n -- the last one that was loaded
346
+ ** m -- the method to be searched
346
347
**
347
348
** Return value:
348
- ** TRUE iff a de-duplication happened, leaving the result referenced by
349
- ** "n" open.
349
+ ** The index of the method in ar, if it is found, else -1
350
350
*/
351
351
352
- static _Bool
353
- ares_dedup (struct authres * ar , int n )
352
+ static int
353
+ ares_method_seen (struct authres * ar , int n , ares_method_t m )
354
354
{
355
355
int c ;
356
356
357
+ if (ar -> ares_result [n ].result_method == ARES_METHOD_DKIM )
358
+ {
359
+ /* All results of DKIM should be kept */
360
+ return -1 ;
361
+ }
357
362
for (c = 0 ; c < n ; c ++ )
358
363
{
359
- if (ar -> ares_result [c ].result_method == ar -> ares_result [n ].result_method &&
360
- ar -> ares_result [c ].result_method != ARES_METHOD_DKIM )
364
+ if (ar -> ares_result [c ].result_method == m )
361
365
{
362
- memcpy (& ar -> ares_result [c ], & ar -> ares_result [n ],
363
- sizeof (ar -> ares_result [c ]));
364
- return TRUE;
366
+ return c ;
365
367
}
366
368
}
367
369
368
- return FALSE ;
370
+ return -1 ;
369
371
}
370
372
371
373
/*
@@ -390,6 +392,8 @@ ares_parse(u_char *hdr, struct authres *ar)
390
392
int r = 0 ;
391
393
int state ;
392
394
int prevstate ;
395
+ int i ; /* index of a result to be recorded */
396
+ ares_method_t m ;
393
397
u_char tmp [ARC_MAXHEADER + 2 ];
394
398
u_char * tokens [ARES_MAXTOKENS ];
395
399
@@ -406,14 +410,21 @@ ares_parse(u_char *hdr, struct authres *ar)
406
410
prevstate = -1 ;
407
411
state = 0 ;
408
412
n = 0 ;
413
+ i = 0 ;
409
414
410
415
for (c = 0 ; c < ntoks ; c ++ )
411
416
{
412
417
if (tokens [c ][0 ] == '(' ) /* comment */
413
418
{
414
- strlcpy ((char * ) ar -> ares_result [n - 1 ].result_comment ,
415
- (char * ) tokens [c ],
416
- sizeof ar -> ares_result [n - 1 ].result_comment );
419
+ if (i >= 0 && prevstate == 5 )
420
+ {
421
+ /* record at most one comment only */
422
+ assert (state == 6 );
423
+ strlcpy ((char * ) ar -> ares_result [i ].result_comment ,
424
+ (char * ) tokens [c ],
425
+ sizeof ar -> ares_result [i ].result_comment );
426
+ prevstate = state ;
427
+ }
417
428
continue ;
418
429
}
419
430
@@ -488,27 +499,55 @@ ares_parse(u_char *hdr, struct authres *ar)
488
499
break ;
489
500
490
501
case 3 : /* method/none */
491
- if (n == 0 || !ares_dedup (ar , n ))
492
- n ++ ;
493
-
494
- if (n >= MAXARESULTS )
495
- return 0 ;
496
-
497
- r = 0 ;
498
-
499
502
if (strcasecmp ((char * ) tokens [c ], "none" ) == 0 )
500
503
{
501
- if (n > 0 )
502
- n -- ;
504
+ switch (prevstate )
505
+ {
506
+ case 0 :
507
+ case 1 :
508
+ case 2 :
509
+ prevstate = state ;
510
+ state = 14 ;
511
+ continue ;
512
+ default :
513
+ /* should not have other resinfo */
514
+ return -1 ;
515
+ }
516
+ }
503
517
504
- prevstate = state ;
505
- state = 14 ;
518
+ m = ares_convert (methods , (char * ) tokens [c ]);
519
+ switch (m )
520
+ {
521
+ case ARES_METHOD_UNKNOWN :
522
+ i = -1 ;
523
+ break ;
524
+ case ARES_METHOD_DKIM :
525
+ i = n ;
526
+ break ;
527
+ default :
528
+ i = ares_method_seen (ar , n , m );
529
+ if (i == -1 )
530
+ {
531
+ i = n ;
532
+ }
533
+ else
534
+ {
535
+ /* Reuse results field of same method */
536
+ memset (& ar -> ares_result [i ], '\0' ,
537
+ sizeof (ar -> ares_result [i ]));
538
+ }
539
+ }
506
540
507
- continue ;
541
+ r = 0 ;
542
+ if (i >= MAXARESULTS )
543
+ {
544
+ /* continue parsing, but don't record */
545
+ i = -1 ;
508
546
}
509
547
510
- ar -> ares_result [n - 1 ].result_method = ares_convert (methods ,
511
- (char * ) tokens [c ]);
548
+ if (i >= 0 ) {
549
+ ar -> ares_result [i ].result_method = m ;
550
+ }
512
551
prevstate = state ;
513
552
state = 4 ;
514
553
@@ -525,9 +564,12 @@ ares_parse(u_char *hdr, struct authres *ar)
525
564
break ;
526
565
527
566
case 5 : /* result */
528
- ar -> ares_result [n - 1 ].result_result = ares_convert (aresults ,
529
- (char * ) tokens [c ]);
530
- ar -> ares_result [n - 1 ].result_comment [0 ] = '\0' ;
567
+ if (i >= 0 )
568
+ {
569
+ ar -> ares_result [i ].result_result = ares_convert (aresults ,
570
+ (char * ) tokens [c ]);
571
+ ar -> ares_result [i ].result_comment [0 ] = '\0' ;
572
+ }
531
573
prevstate = state ;
532
574
state = 6 ;
533
575
@@ -544,9 +586,12 @@ ares_parse(u_char *hdr, struct authres *ar)
544
586
break ;
545
587
546
588
case 8 :
547
- strlcpy ((char * ) ar -> ares_result [n - 1 ].result_reason ,
548
- (char * ) tokens [c ],
549
- sizeof ar -> ares_result [n - 1 ].result_reason );
589
+ if (i >= 0 )
590
+ {
591
+ strlcpy ((char * ) ar -> ares_result [i ].result_reason ,
592
+ (char * ) tokens [c ],
593
+ sizeof ar -> ares_result [i ].result_reason );
594
+ }
550
595
551
596
prevstate = state ;
552
597
state = 9 ;
@@ -557,6 +602,11 @@ ares_parse(u_char *hdr, struct authres *ar)
557
602
if (tokens [c ][0 ] == ';' && /* neither */
558
603
tokens [c ][1 ] == '\0' )
559
604
{
605
+ if (i == n )
606
+ {
607
+ n ++ ;
608
+ }
609
+
560
610
prevstate = state ;
561
611
state = 3 ;
562
612
@@ -585,9 +635,12 @@ ares_parse(u_char *hdr, struct authres *ar)
585
635
{
586
636
r -- ;
587
637
588
- strlcat ((char * ) ar -> ares_result [n - 1 ].result_value [r ],
589
- (char * ) tokens [c ],
590
- sizeof ar -> ares_result [n - 1 ].result_value [r ]);
638
+ if (i >= 0 )
639
+ {
640
+ strlcat ((char * ) ar -> ares_result [i ].result_value [r ],
641
+ (char * ) tokens [c ],
642
+ sizeof ar -> ares_result [i ].result_value [r ]);
643
+ }
591
644
592
645
prevstate = state ;
593
646
state = 13 ;
@@ -598,6 +651,11 @@ ares_parse(u_char *hdr, struct authres *ar)
598
651
if (tokens [c ][0 ] == ';' &&
599
652
tokens [c ][1 ] == '\0' )
600
653
{
654
+ if (i == n )
655
+ {
656
+ n ++ ;
657
+ }
658
+
601
659
prevstate = state ;
602
660
state = 3 ;
603
661
@@ -611,8 +669,10 @@ ares_parse(u_char *hdr, struct authres *ar)
611
669
if (x == ARES_PTYPE_UNKNOWN )
612
670
return -1 ;
613
671
614
- if (r < MAXPROPS )
615
- ar -> ares_result [n - 1 ].result_ptype [r ] = x ;
672
+ if (r < MAXPROPS && i >= 0 )
673
+ {
674
+ ar -> ares_result [i ].result_ptype [r ] = x ;
675
+ }
616
676
617
677
prevstate = state ;
618
678
state = 10 ;
@@ -631,11 +691,11 @@ ares_parse(u_char *hdr, struct authres *ar)
631
691
break ;
632
692
633
693
case 11 : /* property */
634
- if (r < MAXPROPS )
694
+ if (r < MAXPROPS && i >= 0 )
635
695
{
636
- strlcpy ((char * ) ar -> ares_result [n - 1 ].result_property [r ],
696
+ strlcpy ((char * ) ar -> ares_result [i ].result_property [r ],
637
697
(char * ) tokens [c ],
638
- sizeof ar -> ares_result [n - 1 ].result_property [r ]);
698
+ sizeof ar -> ares_result [i ].result_property [r ]);
639
699
}
640
700
641
701
prevstate = state ;
@@ -656,11 +716,14 @@ ares_parse(u_char *hdr, struct authres *ar)
656
716
case 13 : /* value */
657
717
if (r < MAXPROPS )
658
718
{
659
- strlcat ((char * ) ar -> ares_result [n - 1 ].result_value [r ],
660
- (char * ) tokens [c ],
661
- sizeof ar -> ares_result [n - 1 ].result_value [r ]);
719
+ if (i >= 0 )
720
+ {
721
+ strlcat ((char * ) ar -> ares_result [i ].result_value [r ],
722
+ (char * ) tokens [c ],
723
+ sizeof ar -> ares_result [i ].result_value [r ]);
724
+ ar -> ares_result [i ].result_props = r + 1 ;
725
+ }
662
726
r ++ ;
663
- ar -> ares_result [n - 1 ].result_props = r ;
664
727
}
665
728
666
729
prevstate = state ;
@@ -680,10 +743,10 @@ ares_parse(u_char *hdr, struct authres *ar)
680
743
state == 11 || state == 12 )
681
744
return -1 ;
682
745
683
- if (n > 1 )
746
+ if (i == n )
684
747
{
685
- if ( ares_dedup ( ar , n - 1 ))
686
- n -- ;
748
+ /* the last resinfo was added */
749
+ n ++ ;
687
750
}
688
751
689
752
ar -> ares_count = n ;
@@ -750,8 +813,6 @@ ares_getptype(ares_ptype_t ptype)
750
813
** EX_USAGE or EX_OK
751
814
*/
752
815
753
- # define NTOKENS 256
754
-
755
816
int
756
817
main (int argc , char * * argv )
757
818
{
@@ -761,8 +822,8 @@ main(int argc, char **argv)
761
822
char * p ;
762
823
char * progname ;
763
824
struct authres ar ;
764
- u_char buf [1024 ];
765
- u_char * toks [NTOKENS ];
825
+ u_char buf [ARC_MAXHEADER + 2 ];
826
+ u_char * toks [ARES_MAXTOKENS ];
766
827
767
828
progname = (p = strrchr (argv [0 ], '/' )) == NULL ? argv [0 ] : p + 1 ;
768
829
@@ -772,13 +833,14 @@ main(int argc, char **argv)
772
833
return EX_USAGE ;
773
834
}
774
835
775
- c = ares_tokenize (argv [1 ], buf , sizeof buf , toks , NTOKENS );
836
+ c = ares_tokenize (((u_char * * )argv )[1 ], buf , sizeof buf , toks ,
837
+ ARES_MAXTOKENS );
776
838
for (d = 0 ; d < c ; d ++ )
777
839
printf ("token %d = '%s'\n" , d , toks [d ]);
778
840
779
841
printf ("\n" );
780
842
781
- status = ares_parse (argv [1 ], & ar );
843
+ status = ares_parse ((( u_char * * ) argv ) [1 ], & ar );
782
844
if (status == -1 )
783
845
{
784
846
printf ("%s: ares_parse() returned -1\n" , progname );
@@ -804,6 +866,7 @@ main(int argc, char **argv)
804
866
ares_xconvert (aresults ,
805
867
ar .ares_result [c ].result_result ));
806
868
printf ("\treason \"%s\"\n" , ar .ares_result [c ].result_reason );
869
+ printf ("\tcomment \"%s\"\n" , ar .ares_result [c ].result_comment );
807
870
808
871
for (d = 0 ; d < ar .ares_result [c ].result_props ; d ++ )
809
872
{
0 commit comments