@@ -2738,54 +2738,49 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
2738
2738
struct read_data * rd )
2739
2739
{
2740
2740
struct untracked_cache_dir ud , * untracked ;
2741
- const unsigned char * next , * data = rd -> data , * end = rd -> end ;
2741
+ const unsigned char * data = rd -> data , * end = rd -> end ;
2742
+ const unsigned char * eos ;
2742
2743
unsigned int value ;
2743
- int i , len ;
2744
+ int i ;
2744
2745
2745
2746
memset (& ud , 0 , sizeof (ud ));
2746
2747
2747
- next = data ;
2748
- value = decode_varint (& next );
2749
- if (next > end )
2748
+ value = decode_varint (& data );
2749
+ if (data > end )
2750
2750
return -1 ;
2751
2751
ud .recurse = 1 ;
2752
2752
ud .untracked_alloc = value ;
2753
2753
ud .untracked_nr = value ;
2754
2754
if (ud .untracked_nr )
2755
2755
ALLOC_ARRAY (ud .untracked , ud .untracked_nr );
2756
- data = next ;
2757
2756
2758
- next = data ;
2759
- ud .dirs_alloc = ud .dirs_nr = decode_varint (& next );
2760
- if (next > end )
2757
+ ud .dirs_alloc = ud .dirs_nr = decode_varint (& data );
2758
+ if (data > end )
2761
2759
return -1 ;
2762
2760
ALLOC_ARRAY (ud .dirs , ud .dirs_nr );
2763
- data = next ;
2764
2761
2765
- len = strlen ((const char * )data );
2766
- next = data + len + 1 ;
2767
- if (next > rd -> end )
2762
+ eos = memchr (data , '\0' , end - data );
2763
+ if (!eos || eos == end )
2768
2764
return -1 ;
2769
- * untracked_ = untracked = xmalloc (st_add3 (sizeof (* untracked ), len , 1 ));
2765
+
2766
+ * untracked_ = untracked = xmalloc (st_add3 (sizeof (* untracked ), eos - data , 1 ));
2770
2767
memcpy (untracked , & ud , sizeof (ud ));
2771
- memcpy (untracked -> name , data , len + 1 );
2772
- data = next ;
2768
+ memcpy (untracked -> name , data , eos - data + 1 );
2769
+ data = eos + 1 ;
2773
2770
2774
2771
for (i = 0 ; i < untracked -> untracked_nr ; i ++ ) {
2775
- len = strlen ((const char * )data );
2776
- next = data + len + 1 ;
2777
- if (next > rd -> end )
2772
+ eos = memchr (data , '\0' , end - data );
2773
+ if (!eos || eos == end )
2778
2774
return -1 ;
2779
- untracked -> untracked [i ] = xstrdup (( const char * ) data );
2780
- data = next ;
2775
+ untracked -> untracked [i ] = xmemdupz ( data , eos - data );
2776
+ data = eos + 1 ;
2781
2777
}
2782
2778
2783
2779
rd -> ucd [rd -> index ++ ] = untracked ;
2784
2780
rd -> data = data ;
2785
2781
2786
2782
for (i = 0 ; i < untracked -> dirs_nr ; i ++ ) {
2787
- len = read_one_dir (untracked -> dirs + i , rd );
2788
- if (len < 0 )
2783
+ if (read_one_dir (untracked -> dirs + i , rd ) < 0 )
2789
2784
return -1 ;
2790
2785
}
2791
2786
return 0 ;
0 commit comments