@@ -2246,7 +2246,8 @@ struct Formatter {
2246
2246
fmt_start(fmt_),
2247
2247
fmt_cur(fmt_),
2248
2248
width(-1 ),
2249
- num_scanned(-1 ) {}
2249
+ num_scanned(-1 ),
2250
+ skip(false ) {}
2250
2251
2251
2252
int format () {
2252
2253
char *tmp_fmt = build_format_string ();
@@ -2347,6 +2348,7 @@ struct Formatter {
2347
2348
const char *fmt_cur;
2348
2349
int width;
2349
2350
int num_scanned;
2351
+ bool skip;
2350
2352
};
2351
2353
2352
2354
// Formats the input and propagates the input labels to the output. The output
@@ -2550,8 +2552,8 @@ static int scan_buffer(char *str, size_t size, const char *fmt,
2550
2552
while (*formatter.fmt_cur ) {
2551
2553
formatter.fmt_start = formatter.fmt_cur ;
2552
2554
formatter.width = -1 ;
2553
- int retval = 0 ;
2554
- dfsan_label l = 0 ;
2555
+ formatter. skip = false ;
2556
+ int read_count = 0 ;
2555
2557
void *dst_ptr = 0 ;
2556
2558
size_t write_size = 0 ;
2557
2559
if (*formatter.fmt_cur != ' %' ) {
@@ -2560,9 +2562,9 @@ static int scan_buffer(char *str, size_t size, const char *fmt,
2560
2562
for (; *(formatter.fmt_cur + 1 ) && *(formatter.fmt_cur + 1 ) != ' %' ;
2561
2563
++formatter.fmt_cur ) {
2562
2564
}
2563
- retval = formatter.scan ();
2565
+ read_count = formatter.scan ();
2564
2566
dfsan_set_label (0 , formatter.str_cur (),
2565
- formatter.num_written_bytes (retval ));
2567
+ formatter.num_written_bytes (read_count ));
2566
2568
} else {
2567
2569
// Conversion directive. Consume all the characters until a conversion
2568
2570
// specifier or the end of the string.
@@ -2575,58 +2577,61 @@ static int scan_buffer(char *str, size_t size, const char *fmt,
2575
2577
case ' u' :
2576
2578
case ' x' :
2577
2579
case ' X' :
2578
- switch (*(formatter.fmt_cur - 1 )) {
2580
+ if (formatter.skip ) {
2581
+ read_count = formatter.scan ();
2582
+ } else {
2583
+ switch (*(formatter.fmt_cur - 1 )) {
2579
2584
case ' h' :
2580
- // Also covers the 'hh' case (since the size of the arg is still
2581
- // an int).
2582
- dst_ptr = va_arg (ap, int *);
2583
- retval = formatter.scan ((int *)dst_ptr);
2584
- write_size = sizeof (int );
2585
- break ;
2585
+ // Also covers the 'hh' case (since the size of the arg is still
2586
+ // an int).
2587
+ dst_ptr = va_arg (ap, int *);
2588
+ read_count = formatter.scan ((int *)dst_ptr);
2589
+ write_size = sizeof (int );
2590
+ break ;
2586
2591
case ' l' :
2587
- if (formatter.fmt_cur - formatter.fmt_start >= 2 &&
2588
- *(formatter.fmt_cur - 2 ) == ' l' ) {
2592
+ if (formatter.fmt_cur - formatter.fmt_start >= 2 &&
2593
+ *(formatter.fmt_cur - 2 ) == ' l' ) {
2594
+ dst_ptr = va_arg (ap, long long int *);
2595
+ read_count = formatter.scan ((long long int *)dst_ptr);
2596
+ write_size = sizeof (long long int );
2597
+ } else {
2598
+ dst_ptr = va_arg (ap, long int *);
2599
+ read_count = formatter.scan ((long int *)dst_ptr);
2600
+ write_size = sizeof (long int );
2601
+ }
2602
+ break ;
2603
+ case ' q' :
2589
2604
dst_ptr = va_arg (ap, long long int *);
2590
- retval = formatter.scan ((long long int *)dst_ptr);
2605
+ read_count = formatter.scan ((long long int *)dst_ptr);
2591
2606
write_size = sizeof (long long int );
2592
- } else {
2593
- dst_ptr = va_arg (ap, long int *);
2594
- retval = formatter.scan ((long int *)dst_ptr);
2595
- write_size = sizeof (long int );
2596
- }
2597
- break ;
2598
- case ' q' :
2599
- dst_ptr = va_arg (ap, long long int *);
2600
- retval = formatter.scan ((long long int *)dst_ptr);
2601
- write_size = sizeof (long long int );
2602
- break ;
2607
+ break ;
2603
2608
case ' j' :
2604
- dst_ptr = va_arg (ap, intmax_t *);
2605
- retval = formatter.scan ((intmax_t *)dst_ptr);
2606
- write_size = sizeof (intmax_t );
2607
- break ;
2609
+ dst_ptr = va_arg (ap, intmax_t *);
2610
+ read_count = formatter.scan ((intmax_t *)dst_ptr);
2611
+ write_size = sizeof (intmax_t );
2612
+ break ;
2608
2613
case ' z' :
2609
2614
case ' t' :
2610
- dst_ptr = va_arg (ap, size_t *);
2611
- retval = formatter.scan ((size_t *)dst_ptr);
2612
- write_size = sizeof (size_t );
2613
- break ;
2615
+ dst_ptr = va_arg (ap, size_t *);
2616
+ read_count = formatter.scan ((size_t *)dst_ptr);
2617
+ write_size = sizeof (size_t );
2618
+ break ;
2614
2619
default :
2615
- dst_ptr = va_arg (ap, int *);
2616
- retval = formatter.scan ((int *)dst_ptr);
2617
- write_size = sizeof (int );
2618
- }
2619
- // get the label associated with the string at the corresponding
2620
- // place
2621
- l = dfsan_read_label (formatter.str_cur (),
2622
- formatter.num_written_bytes (retval));
2623
- if (str_origin == nullptr )
2620
+ dst_ptr = va_arg (ap, int *);
2621
+ read_count = formatter.scan ((int *)dst_ptr);
2622
+ write_size = sizeof (int );
2623
+ }
2624
+ // get the label associated with the string at the corresponding
2625
+ // place
2626
+ dfsan_label l = dfsan_read_label (
2627
+ formatter.str_cur (), formatter.num_written_bytes (read_count));
2624
2628
dfsan_set_label (l, dst_ptr, write_size);
2625
- else {
2629
+ if (str_origin != nullptr ) {
2626
2630
dfsan_set_label (l, dst_ptr, write_size);
2627
- size_t scan_count = formatter.num_written_bytes (retval );
2631
+ size_t scan_count = formatter.num_written_bytes (read_count );
2628
2632
size_t size = scan_count > write_size ? write_size : scan_count;
2629
2633
dfsan_mem_origin_transfer (dst_ptr, formatter.str_cur (), size);
2634
+ }
2630
2635
}
2631
2636
end_fmt = true ;
2632
2637
@@ -2640,104 +2645,119 @@ static int scan_buffer(char *str, size_t size, const char *fmt,
2640
2645
case ' F' :
2641
2646
case ' g' :
2642
2647
case ' G' :
2643
- if (*(formatter.fmt_cur - 1 ) == ' L' ) {
2648
+ if (formatter.skip ) {
2649
+ read_count = formatter.scan ();
2650
+ } else {
2651
+ if (*(formatter.fmt_cur - 1 ) == ' L' ) {
2644
2652
dst_ptr = va_arg (ap, long double *);
2645
- retval = formatter.scan ((long double *)dst_ptr);
2653
+ read_count = formatter.scan ((long double *)dst_ptr);
2646
2654
write_size = sizeof (long double );
2647
- } else if (*(formatter.fmt_cur - 1 ) == ' l' ) {
2655
+ } else if (*(formatter.fmt_cur - 1 ) == ' l' ) {
2648
2656
dst_ptr = va_arg (ap, double *);
2649
- retval = formatter.scan ((double *)dst_ptr);
2657
+ read_count = formatter.scan ((double *)dst_ptr);
2650
2658
write_size = sizeof (double );
2651
- } else {
2659
+ } else {
2652
2660
dst_ptr = va_arg (ap, float *);
2653
- retval = formatter.scan ((float *)dst_ptr);
2661
+ read_count = formatter.scan ((float *)dst_ptr);
2654
2662
write_size = sizeof (float );
2655
- }
2656
- l = dfsan_read_label (formatter.str_cur (),
2657
- formatter.num_written_bytes (retval));
2658
- if (str_origin == nullptr )
2663
+ }
2664
+ dfsan_label l = dfsan_read_label (
2665
+ formatter.str_cur (), formatter.num_written_bytes (read_count));
2659
2666
dfsan_set_label (l, dst_ptr, write_size);
2660
- else {
2667
+ if (str_origin != nullptr ) {
2661
2668
dfsan_set_label (l, dst_ptr, write_size);
2662
- size_t scan_count = formatter.num_written_bytes (retval );
2669
+ size_t scan_count = formatter.num_written_bytes (read_count );
2663
2670
size_t size = scan_count > write_size ? write_size : scan_count;
2664
2671
dfsan_mem_origin_transfer (dst_ptr, formatter.str_cur (), size);
2672
+ }
2665
2673
}
2666
2674
end_fmt = true ;
2667
2675
break ;
2668
2676
2669
2677
case ' c' :
2670
- dst_ptr = va_arg (ap, char *);
2671
- retval = formatter.scan (( char *)dst_ptr );
2672
- write_size = sizeof ( char );
2673
- l = dfsan_read_label (formatter. str_cur (),
2674
- formatter.num_written_bytes (retval) );
2675
- if (str_origin == nullptr )
2676
- dfsan_set_label (l, dst_ptr, write_size);
2677
- else {
2678
+ if (formatter. skip ) {
2679
+ read_count = formatter.scan ();
2680
+ } else {
2681
+ dst_ptr = va_arg (ap, char *);
2682
+ read_count = formatter.scan (( char *)dst_ptr );
2683
+ write_size = sizeof ( char );
2684
+ dfsan_label l = dfsan_read_label (
2685
+ formatter. str_cur (), formatter. num_written_bytes (read_count));
2678
2686
dfsan_set_label (l, dst_ptr, write_size);
2679
- size_t scan_count = formatter.num_written_bytes (retval);
2687
+ if (str_origin != nullptr ) {
2688
+ size_t scan_count = formatter.num_written_bytes (read_count);
2680
2689
size_t size = scan_count > write_size ? write_size : scan_count;
2681
2690
dfsan_mem_origin_transfer (dst_ptr, formatter.str_cur (), size);
2691
+ }
2682
2692
}
2683
2693
end_fmt = true ;
2684
2694
break ;
2685
2695
2686
2696
case ' s' : {
2687
- dst_ptr = va_arg (ap, char *);
2688
- retval = formatter.scan ((char *)dst_ptr);
2689
- if (1 == retval) {
2697
+ if (formatter.skip ) {
2698
+ read_count = formatter.scan ();
2699
+ } else {
2700
+ dst_ptr = va_arg (ap, char *);
2701
+ read_count = formatter.scan ((char *)dst_ptr);
2702
+ if (1 == read_count) {
2690
2703
// special case: we have parsed a single string and we need to
2691
- // update retval with the string size
2692
- retval = strlen ((char *)dst_ptr);
2693
- }
2694
- if (str_origin)
2704
+ // update read_count with the string size
2705
+ read_count = strlen ((char *)dst_ptr);
2706
+ }
2707
+ if (str_origin)
2695
2708
dfsan_mem_origin_transfer (dst_ptr, formatter.str_cur (),
2696
- formatter.num_written_bytes (retval));
2697
- va_labels++;
2698
- dfsan_mem_shadow_transfer (dst_ptr, formatter.str_cur (),
2699
- formatter.num_written_bytes (retval));
2709
+ formatter.num_written_bytes (read_count));
2710
+ va_labels++;
2711
+ dfsan_mem_shadow_transfer (dst_ptr, formatter.str_cur (),
2712
+ formatter.num_written_bytes (read_count));
2713
+ }
2700
2714
end_fmt = true ;
2701
2715
break ;
2702
2716
}
2703
2717
2704
2718
case ' p' :
2705
- dst_ptr = va_arg (ap, void *);
2706
- retval =
2707
- formatter.scan ((int *)dst_ptr); // note: changing void* to int*
2708
- // since we need to call sizeof
2709
- write_size = sizeof (int );
2710
-
2711
- l = dfsan_read_label (formatter.str_cur (),
2712
- formatter.num_written_bytes (retval));
2713
- if (str_origin == nullptr )
2719
+ if (formatter.skip ) {
2720
+ read_count = formatter.scan ();
2721
+ } else {
2722
+ dst_ptr = va_arg (ap, void *);
2723
+ read_count =
2724
+ formatter.scan ((int *)dst_ptr); // note: changing void* to int*
2725
+ // since we need to call sizeof
2726
+ write_size = sizeof (int );
2727
+
2728
+ dfsan_label l = dfsan_read_label (
2729
+ formatter.str_cur (), formatter.num_written_bytes (read_count));
2714
2730
dfsan_set_label (l, dst_ptr, write_size);
2715
- else {
2731
+ if (str_origin != nullptr ) {
2716
2732
dfsan_set_label (l, dst_ptr, write_size);
2717
- size_t scan_count = formatter.num_written_bytes (retval );
2733
+ size_t scan_count = formatter.num_written_bytes (read_count );
2718
2734
size_t size = scan_count > write_size ? write_size : scan_count;
2719
2735
dfsan_mem_origin_transfer (dst_ptr, formatter.str_cur (), size);
2736
+ }
2720
2737
}
2721
2738
end_fmt = true ;
2722
2739
break ;
2723
2740
2724
2741
case ' n' : {
2725
- int *ptr = va_arg (ap, int *);
2726
- *ptr = (int )formatter.str_off ;
2727
- va_labels++;
2728
- dfsan_set_label (0 , ptr, sizeof (*ptr));
2742
+ if (!formatter.skip ) {
2743
+ int *ptr = va_arg (ap, int *);
2744
+ *ptr = (int )formatter.str_off ;
2745
+ *va_labels++ = 0 ;
2746
+ dfsan_set_label (0 , ptr, sizeof (*ptr));
2747
+ if (str_origin != nullptr )
2748
+ *str_origin++ = 0 ;
2749
+ }
2729
2750
end_fmt = true ;
2730
2751
break ;
2731
2752
}
2732
2753
2733
2754
case ' %' :
2734
- retval = formatter.scan ();
2755
+ read_count = formatter.scan ();
2735
2756
end_fmt = true ;
2736
2757
break ;
2737
2758
2738
2759
case ' *' :
2739
- formatter.width = va_arg (ap, int );
2740
- va_labels++;
2760
+ formatter.skip = true ;
2741
2761
break ;
2742
2762
2743
2763
default :
@@ -2746,12 +2766,13 @@ static int scan_buffer(char *str, size_t size, const char *fmt,
2746
2766
}
2747
2767
}
2748
2768
2749
- if (retval < 0 ) {
2750
- return retval;
2769
+ if (read_count < 0 ) {
2770
+ // There was an error.
2771
+ return read_count;
2751
2772
}
2752
2773
2753
2774
formatter.fmt_cur ++;
2754
- formatter.str_off += retval ;
2775
+ formatter.str_off += read_count ;
2755
2776
}
2756
2777
2757
2778
(void )va_labels; // Silence unused-but-set-parameter warning
0 commit comments