@@ -2738,54 +2738,49 @@ static int read_one_dir(struct untracked_cache_dir **untracked_,
27382738 struct read_data * rd )
27392739{
27402740 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 ;
27422743 unsigned int value ;
2743- int i , len ;
2744+ int i ;
27442745
27452746 memset (& ud , 0 , sizeof (ud ));
27462747
2747- next = data ;
2748- value = decode_varint (& next );
2749- if (next > end )
2748+ value = decode_varint (& data );
2749+ if (data > end )
27502750 return -1 ;
27512751 ud .recurse = 1 ;
27522752 ud .untracked_alloc = value ;
27532753 ud .untracked_nr = value ;
27542754 if (ud .untracked_nr )
27552755 ALLOC_ARRAY (ud .untracked , ud .untracked_nr );
2756- data = next ;
27572756
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 )
27612759 return -1 ;
27622760 ALLOC_ARRAY (ud .dirs , ud .dirs_nr );
2763- data = next ;
27642761
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 )
27682764 return -1 ;
2769- * untracked_ = untracked = xmalloc (st_add3 (sizeof (* untracked ), len , 1 ));
2765+
2766+ * untracked_ = untracked = xmalloc (st_add3 (sizeof (* untracked ), eos - data , 1 ));
27702767 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 ;
27732770
27742771 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 )
27782774 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 ;
27812777 }
27822778
27832779 rd -> ucd [rd -> index ++ ] = untracked ;
27842780 rd -> data = data ;
27852781
27862782 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 )
27892784 return -1 ;
27902785 }
27912786 return 0 ;
0 commit comments