17
17
#define DEFAULT_TREE_SIZE 16
18
18
#define MAX_FILEMODE_BYTES 6
19
19
20
+ #define TREE_ENTRY_CHECK_NAMELEN (n ) \
21
+ if (n > UINT16_MAX) { giterr_set(GITERR_INVALID, "tree entry path too long"); }
22
+
20
23
GIT__USE_STRMAP
21
24
22
25
static bool valid_filemode (const int filemode )
@@ -89,10 +92,7 @@ static git_tree_entry *alloc_entry_base(git_pool *pool, const char *filename, si
89
92
git_tree_entry * entry = NULL ;
90
93
size_t tree_len ;
91
94
92
- if (filename_len > UINT16_MAX ) {
93
- giterr_set (GITERR_INVALID , "tree entry is over UINT16_MAX in length" );
94
- return NULL ;
95
- }
95
+ TREE_ENTRY_CHECK_NAMELEN (filename_len );
96
96
97
97
if (GIT_ADD_SIZET_OVERFLOW (& tree_len , sizeof (git_tree_entry ), filename_len ) ||
98
98
GIT_ADD_SIZET_OVERFLOW (& tree_len , tree_len , 1 ))
@@ -106,7 +106,7 @@ static git_tree_entry *alloc_entry_base(git_pool *pool, const char *filename, si
106
106
memset (entry , 0x0 , sizeof (git_tree_entry ));
107
107
memcpy (entry -> filename , filename , filename_len );
108
108
entry -> filename [filename_len ] = 0 ;
109
- entry -> filename_len = filename_len ;
109
+ entry -> filename_len = ( uint16_t ) filename_len ;
110
110
111
111
return entry ;
112
112
}
@@ -143,8 +143,8 @@ static int homing_search_cmp(const void *key, const void *array_member)
143
143
const struct tree_key_search * ksearch = key ;
144
144
const git_tree_entry * entry = array_member ;
145
145
146
- const size_t len1 = ksearch -> filename_len ;
147
- const size_t len2 = entry -> filename_len ;
146
+ const uint16_t len1 = ksearch -> filename_len ;
147
+ const uint16_t len2 = entry -> filename_len ;
148
148
149
149
return memcmp (
150
150
ksearch -> filename ,
@@ -180,8 +180,10 @@ static int tree_key_search(
180
180
const git_tree_entry * entry ;
181
181
size_t homing , i ;
182
182
183
+ TREE_ENTRY_CHECK_NAMELEN (filename_len );
184
+
183
185
ksearch .filename = filename ;
184
- ksearch .filename_len = filename_len ;
186
+ ksearch .filename_len = ( uint16_t ) filename_len ;
185
187
186
188
/* Initial homing search; find an entry on the tree with
187
189
* the same prefix as the filename we're looking for */
@@ -334,6 +336,7 @@ const git_tree_entry *git_tree_entry_byname(
334
336
const git_tree * tree , const char * filename )
335
337
{
336
338
assert (tree && filename );
339
+
337
340
return entry_fromname (tree , filename , strlen (filename ));
338
341
}
339
342
@@ -364,13 +367,16 @@ int git_tree__prefix_position(const git_tree *tree, const char *path)
364
367
{
365
368
const git_vector * entries = & tree -> entries ;
366
369
struct tree_key_search ksearch ;
367
- size_t at_pos ;
370
+ size_t at_pos , path_len ;
368
371
369
372
if (!path )
370
373
return 0 ;
371
374
375
+ path_len = strlen (path );
376
+ TREE_ENTRY_CHECK_NAMELEN (path_len );
377
+
372
378
ksearch .filename = path ;
373
- ksearch .filename_len = strlen ( path ) ;
379
+ ksearch .filename_len = ( uint16_t ) path_len ;
374
380
375
381
/* be safe when we cast away constness - i.e. don't trigger a sort */
376
382
assert (git_vector_is_sorted (& tree -> entries ));
0 commit comments