From: Jeff King <peff@peff.net>
To: Matheus Tavares <matheus.bernardino@usp.br>
Cc: yguoaz@gmail.com, git@vger.kernel.org
Subject: Re: A possible divide by zero problem in read-cache.c
Date: Thu, 29 Apr 2021 16:56:37 -0400 [thread overview]
Message-ID: <YIsdhdQX03osraFD@coredump.intra.peff.net> (raw)
In-Reply-To: <20210429145424.515208-1-matheus.bernardino@usp.br>
On Thu, Apr 29, 2021 at 11:54:24AM -0300, Matheus Tavares wrote:
> > Step 1: (calling another function load_cache_entries_threaded with
> > nr_threads as an argument ) [ link:
> > https://github.com/git/git/blob/311531c9de557d25ac087c1637818bd2aad6eb3a/read-cache.c#L2247
> > ]
> > src_offset += load_cache_entries_threaded(istate, mmap,
> > mmap_size, nr_threads, ieot);
>
> Hmm, this function call is guarded by an `if (ieot)` block:
>
> if (ieot) {
> src_offset += load_cache_entries_threaded(istate, mmap, mmap_size, nr_threads, ieot);
> free(ieot);
> } else {
> src_offset += load_all_cache_entries(istate, mmap, mmap_size, src_offset);
> }
>
>
> And `ieot` will only get a non-NULL value if this previous assignment was
> executed:
>
> if (extension_offset && nr_threads > 1)
> ieot = read_ieot_extension(mmap, mmap_size, extension_offset);
>
> So it seems to me that we only call `load_cache_entries_threaded()` when
> `nr_threads > 1`.
Thanks for tracing this. I agree that this doesn't seem to be
triggerable along that patch for this reason.
There is another assignment to nr_threads inside the function with the
division:
if (nr_threads > ieot->nr)
nr_threads = ieot->nr;
CALLOC_ARRAY(data, nr_threads);
offset = ieot_start = 0;
ieot_blocks = DIV_ROUND_UP(ieot->nr, nr_threads);
Is it possible for ieot->nr to be 0? Almost certainly it would be a bug
for something to have written it, but I wonder if a malicious file could
trigger this.
Going back to read_ieot_extension(), I think the answer is "no". It
does:
/* extension size - version bytes / bytes per entry */
nr = (extsize - sizeof(uint32_t)) / (sizeof(uint32_t) + sizeof(uint32_t));
if (!nr) {
error("invalid number of IEOT entries %d", nr);
return NULL;
}
ieot = xmalloc(sizeof(struct index_entry_offset_table)
+ (nr * sizeof(struct index_entry_offset)));
ieot->nr = nr;
so it will reject such an extension.
So I think all is well here.
-Peff
prev parent reply other threads:[~2021-04-29 20:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-29 14:33 A possible divide by zero problem in read-cache.c Yiyuan guo
2021-04-29 14:54 ` Matheus Tavares
2021-04-29 20:56 ` Jeff King [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YIsdhdQX03osraFD@coredump.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=matheus.bernardino@usp.br \
--cc=yguoaz@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).