Re: [HOLD 3/4] check_packed_git_idx: attempt to handle ENOMEM from mmap
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 29, 2021, 21:33 UTC
- Message-ID
- <xmqqbl7owe2q.fsf@gitster.g>
- In-Reply-To
- <20210629202101.GA18279@dcvr>
Eric Wong <e@80x24.org> writes:
Show 19 quoted lines
> Eric Wong <e@80x24.org> wrote:
>> --- a/packfile.c
>> +++ b/packfile.c
>> @@ -97,7 +97,11 @@ static int check_packed_git_idx(const char *path, struct packed_git *p)
>> close(fd);
>> return error("index file %s is too small", path);
>> }
>> - idx_map = xmmap(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0);
>> + do {
>> + idx_map = xmmap_gently(NULL, idx_size, PROT_READ, MAP_PRIVATE,
>> + fd, 0);
>> + } while (idx_map == MAP_FAILED && errno == ENOMEM
>> + && unuse_one_window(p));
>
> Oops, I dropped extra error handling here :x
>
>> close(fd);
>>
>> ret = load_idx(path, hashsz, idx_map, idx_size, p);Something like this, perhaps? You'd also need _() around the error message you added to object-file.c in [2/4], I would think.
packfile.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git c/packfile.c w/packfile.c index 2904560f52..b31f14ecb7 100644 --- c/packfile.c +++ w/packfile.c @@ -102,6 +102,10 @@ static int check_packed_git_idx(const char *path, struct packed_git *p) fd, 0); } while (idx_map == MAP_FAILED && errno == ENOMEM && unuse_one_window(p)); + if (idx_map == MAP_FAILED) { + close(fd); + return error_errno(_("%s cannot be mapped"), path); + } close(fd); ret = load_idx(path, hashsz, idx_map, idx_size, p);