@@ -86,10 +86,10 @@ int git_tree_entry_icmp(const git_tree_entry *e1, const git_tree_entry *e2)
86
86
* owns it. This is useful when reading trees, so we don't allocate a
87
87
* ton of small strings but can use the pool.
88
88
*/
89
- static git_tree_entry * alloc_entry_pooled (git_pool * pool , const char * filename )
89
+ static git_tree_entry * alloc_entry_pooled (git_pool * pool , const char * filename , size_t filename_len )
90
90
{
91
91
git_tree_entry * entry = NULL ;
92
- size_t filename_len = strlen ( filename ), tree_len ;
92
+ size_t tree_len ;
93
93
94
94
if (GIT_ADD_SIZET_OVERFLOW (& tree_len , sizeof (git_tree_entry ), filename_len ) ||
95
95
GIT_ADD_SIZET_OVERFLOW (& tree_len , tree_len , 1 ) ||
@@ -416,6 +416,8 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj)
416
416
417
417
while (buffer < buffer_end ) {
418
418
git_tree_entry * entry ;
419
+ size_t filename_len ;
420
+ const char * nul ;
419
421
int attr ;
420
422
421
423
if (git__strtol32 (& attr , buffer , & buffer , 8 ) < 0 || !buffer )
@@ -424,12 +426,13 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj)
424
426
if (* buffer ++ != ' ' )
425
427
return tree_error ("Failed to parse tree. Object is corrupted" , NULL );
426
428
427
- if (memchr (buffer , 0 , buffer_end - buffer ) == NULL )
429
+ if (( nul = memchr (buffer , 0 , buffer_end - buffer ) ) == NULL )
428
430
return tree_error ("Failed to parse tree. Object is corrupted" , NULL );
429
431
432
+ filename_len = nul - buffer ;
430
433
/** Allocate the entry and store it in the entries vector */
431
434
{
432
- entry = alloc_entry_pooled (& tree -> pool , buffer );
435
+ entry = alloc_entry_pooled (& tree -> pool , buffer , filename_len );
433
436
GITERR_CHECK_ALLOC (entry );
434
437
435
438
if (git_vector_insert (& tree -> entries , entry ) < 0 )
@@ -439,7 +442,7 @@ int git_tree__parse(void *_tree, git_odb_object *odb_obj)
439
442
}
440
443
441
444
/* Advance to the ID just after the path */
442
- buffer += entry -> filename_len + 1 ;
445
+ buffer += filename_len + 1 ;
443
446
444
447
git_oid_fromraw (& entry -> oid , (const unsigned char * )buffer );
445
448
buffer += GIT_OID_RAWSZ ;
0 commit comments