Skip to content

Commit eb22e7d

Browse files
pks-tgitster
authored andcommitted
attr: fix overflow when upserting attribute with overly long name
The function `git_attr_internal()` is called to upsert attributes into the global map. And while all callers pass a `size_t`, the function itself accepts an `int` as the attribute name's length. This can lead to an integer overflow in case the attribute name is longer than `INT_MAX`. Now this overflow seems harmless as the first thing we do is to call `attr_name_valid()`, and that function only succeeds in case all chars in the range of `namelen` match a certain small set of chars. We thus can't do an out-of-bounds read as NUL is not part of that set and all strings passed to this function are NUL-terminated. And furthermore, we wouldn't ever read past the current attribute name anyway due to the same reason. And if validation fails we will return early. On the other hand it feels fragile to rely on this behaviour, even more so given that we pass `namelen` to `FLEX_ALLOC_MEM()`. So let's instead just do the correct thing here and accept a `size_t` as line length. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent abd4d67 commit eb22e7d

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

attr.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ static void report_invalid_attr(const char *name, size_t len,
210210
* dictionary. If no entry is found, create a new attribute and store it in
211211
* the dictionary.
212212
*/
213-
static const struct git_attr *git_attr_internal(const char *name, int namelen)
213+
static const struct git_attr *git_attr_internal(const char *name, size_t namelen)
214214
{
215215
struct git_attr *a;
216216

0 commit comments

Comments
 (0)