From: Jeff Hostetler <git@jeffhostetler.com>
To: Andrzej Hunt via GitGitGadget <gitgitgadget@gmail.com>,
git@vger.kernel.org
Cc: Jeff Hostetler <jeffhost@microsoft.com>,
Andrzej Hunt <andrzej@ahunt.org>,
Andrzej Hunt <ajrhunt@google.com>
Subject: Re: [PATCH] fsmonitor: avoid global-buffer-overflow READ when checking trivial response
Date: Tue, 16 Mar 2021 10:20:29 -0400 [thread overview]
Message-ID: <c34badb9-a3bc-a5fe-c6fc-c1bdce867e0d@jeffhostetler.com> (raw)
In-Reply-To: <pull.904.git.1615826363431.gitgitgadget@gmail.com>
On 3/15/21 12:39 PM, Andrzej Hunt via GitGitGadget wrote:
> From: Andrzej Hunt <ajrhunt@google.com>
>
> query_result can be be an empty strbuf (STRBUF_INIT) - in that case
> trying to read 3 bytes triggers a buffer overflow read (as
> query_result.buf = '\0').
>
> Therefore we need to check query_result's length before trying to read 3
> bytes.
>
> This overflow was introduced in:
> 940b94f35c (fsmonitor: log invocation of FSMonitor hook to trace2, 2021-02-03)
> It was found when running the test-suite against ASAN, and can be most
> easily reproduced with the following command:
[...]
> fsmonitor: fix overflow read
>
> This patch fixes a buffer overflow read in
> fsmonitor_is_trivial_response().
>
> I'm not super familiar with fsmonitor, so I'm not 100% sure what the
> empty response actually means. Based on my reading of the docs below,
> this can happen with fsmonitor-watchman v1 when no files have changed.
> But it could also happen for v2 if the implementation is broken (in
> which case we also shouldn't overflow)? Either way, I'm guessing the
> empty response doesn't count as trivial:
> https://git-scm.com/docs/githooks#_fsmonitor_watchman
>
> The other question I had is: can watchman V1 return "/\0" as the trivial
> response (as it has no token header) - and should we be recognising that
> too?
>
> ATB,
>
> Andrzej
[...]
Looks good to me. And thanks for catching this.
WRT your questions:
An empty response means no files have changed since the last query.
The client can assume all cache-entries are valid and doesn't need
to scan.
A "trivial" response means that the monitor doesn't have enough
information to answer the question. The client should assume that
everything is invalid and do a full scan (as if no monitor were
present).
I added the `fsmonitor_is_trivial_response()` function with the
tracing that I added in [1] in preparation for adding a builtin
fsmonitor service (and currently only my tracing uses that function),
but the concept of a trivial "/" response line has been present since
the initial fsmonitor implementation [2]. See [3] and [4].
[1] 940b94f35c (fsmonitor: log invocation of FSMonitor hook to trace2,
2021-02-03)
[2] 883e248b8a (fsmonitor: teach git to optionally utilize a file system
monitor to speed up detecting new or changed files., 2017-09-22)
[3]
https://github.com/git/git/blob/a5828ae6b52137b913b978e16cd2334482eb4c1f/fsmonitor.c#L304
[4]
https://github.com/git/git/blob/a5828ae6b52137b913b978e16cd2334482eb4c1f/fsmonitor.c#L320
Thanks again for the review.
Jeff
next prev parent reply other threads:[~2021-03-16 14:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-15 16:39 [PATCH] fsmonitor: avoid global-buffer-overflow READ when checking trivial response Andrzej Hunt via GitGitGadget
2021-03-16 10:55 ` Bagas Sanjaya
2021-03-16 14:20 ` Jeff Hostetler [this message]
2021-03-17 17:10 ` Junio C Hamano
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c34badb9-a3bc-a5fe-c6fc-c1bdce867e0d@jeffhostetler.com \
--to=git@jeffhostetler.com \
--cc=ajrhunt@google.com \
--cc=andrzej@ahunt.org \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=jeffhost@microsoft.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.
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 NNTP newsgroup(s).