@@ -82,47 +82,57 @@ int git_tree_entry_icmp(const git_tree_entry *e1, const git_tree_entry *e2)
82
82
}
83
83
84
84
/**
85
- * Allocate a tree entry, borrowing the filename from the tree which
86
- * owns it. This is useful when reading trees, so we don't allocate a
87
- * ton of small strings but can use the pool.
85
+ * Allocate either from the pool or from the system allocator
88
86
*/
89
- static git_tree_entry * alloc_entry_pooled (git_pool * pool , const char * filename , size_t filename_len )
87
+ static git_tree_entry * alloc_entry_base (git_pool * pool , const char * filename , size_t filename_len )
90
88
{
91
89
git_tree_entry * entry = NULL ;
92
90
size_t tree_len ;
93
91
92
+ if (filename_len > UINT16_MAX ) {
93
+ giterr_set (GITERR_INVALID , "tree entry is over UINT16_MAX in length" );
94
+ return NULL ;
95
+ }
96
+
94
97
if (GIT_ADD_SIZET_OVERFLOW (& tree_len , sizeof (git_tree_entry ), filename_len ) ||
95
- GIT_ADD_SIZET_OVERFLOW (& tree_len , tree_len , 1 ) ||
96
- !(entry = git_pool_malloc (pool , tree_len )))
98
+ GIT_ADD_SIZET_OVERFLOW (& tree_len , tree_len , 1 ))
99
+ return NULL ;
100
+
101
+ entry = pool ? git_pool_malloc (pool , tree_len ) :
102
+ git__malloc (tree_len );
103
+ if (!entry )
97
104
return NULL ;
98
105
99
106
memset (entry , 0x0 , sizeof (git_tree_entry ));
100
107
memcpy (entry -> filename , filename , filename_len );
101
108
entry -> filename [filename_len ] = 0 ;
102
109
entry -> filename_len = filename_len ;
103
- entry -> pooled = true;
104
110
105
111
return entry ;
106
112
}
107
113
108
- static git_tree_entry * alloc_entry (const char * filename )
114
+ /**
115
+ * Allocate a tree entry, using the poolin the tree which owns
116
+ * it. This is useful when reading trees, so we don't allocate a ton
117
+ * of small strings but can use the pool.
118
+ */
119
+ static git_tree_entry * alloc_entry_pooled (git_pool * pool , const char * filename , size_t filename_len )
109
120
{
110
121
git_tree_entry * entry = NULL ;
111
- size_t filename_len = strlen (filename ), tree_len ;
112
122
113
- if (GIT_ADD_SIZET_OVERFLOW (& tree_len , sizeof (git_tree_entry ), filename_len ) ||
114
- GIT_ADD_SIZET_OVERFLOW (& tree_len , tree_len , 1 ) ||
115
- !(entry = git__malloc (tree_len )))
123
+ if (!(entry = alloc_entry_base (pool , filename , filename_len )))
116
124
return NULL ;
117
125
118
- memset (entry , 0x0 , sizeof (git_tree_entry ));
119
- memcpy (entry -> filename , filename , filename_len );
120
- entry -> filename [filename_len ] = 0 ;
121
- entry -> filename_len = filename_len ;
126
+ entry -> pooled = true;
122
127
123
128
return entry ;
124
129
}
125
130
131
+ static git_tree_entry * alloc_entry (const char * filename )
132
+ {
133
+ return alloc_entry_base (NULL , filename , strlen (filename ));
134
+ }
135
+
126
136
struct tree_key_search {
127
137
const char * filename ;
128
138
uint16_t filename_len ;
0 commit comments