git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/4] receive-pack: implement advertising and receiving push options

From
Stefan Beller <sbeller@google.com>
Date
Jul 8, 2016, 22:17 UTC
Message-ID
<CAGZ79kZOdcJwd0ePMquhfJTv=xZGP_+w4BRV=GyTy3ejb79yrQ@mail.gmail.com>
In-Reply-To
<20160708214637.GB9820@sigill.intra.peff.net>
On Fri, Jul 8, 2016 at 2:46 PM, Jeff King <peff@peff.net> wrote:
Show 18 quoted lines
> On Fri, Jul 08, 2016 at 11:57:20AM -0700, Stefan Beller wrote:
>
>> >> Sorry to butt into the conversation late, but: I am not yet convinced.
>> >>
>> >> Is the idea that if the push options were very large, this would save
>> >> the client from the cost of sending them?
>> >
>> > Not really.  I have no strong opinion on the benefit of limiting
>> > number/size.  Stefan limited the number/size at the receiving end
>> > and made receiving end die with its message.
>>
>> Jeff claimed we'd need some sort of DoS protection for this feature,
>> so I considered just die-ing enough for an initial implementation.
>
> I do not think we need to worry too much about niceties for these
> limits. The point is to protect servers from malicious nonsense, like
> somebody sending gigabytes of push options, or trying to overflow a
> buffer in a hook with a large value.
Agreed. This would speak for keeping the implementation as is.
Show 6 quoted lines
>If people are seeing these in
> routine use, then the limits are set too low, and this should happen
> roughly as often as a BUG assertion, and IMHO should be treated roughly
> the same: don't bother with translation, and don't worry about
> optimizing wasted bandwidth for this case. It won't happen enough to
> matter.

Well the wasted band width is part of the server protection, no? This would favor the idea Jonathan came up with:

    server: I advertise push options
    client: ok I want to use push options
    client: I'll send you 1000 push options with upper bound of 1000M
    server: It's a bit too much, eh?
    * server quits

So this case only occurs for the (malicious?) corner case, where I do not bother a translation.

But having the size announcement not in the capability advertisement, but in the actual push options phase makes sense to me as we do not want to clutter the capabilities with data that can come later. We would only waste a little bit of band width, (the initial ls-remote and command list of the client).

Speaking of this, I can craft a malicious client that sends the following command list

0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 refs/heads/loooooooooooooooooong-ref 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 refs/heads/loooooooooooooooooong-ref 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 refs/heads/loooooooooooooooooong-ref 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 refs/heads/loooooooooooooooooong-ref 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 refs/heads/loooooooooooooooooong-ref <repeat the above a few times> 0000

IIUC in the receive-pack code we would queue that up and the error checking (two times null sha1? update of the same ref more than once?), is done just after we send out the flush packet, i.e. when all commands are received.

This would also result in sending gigabytes of junk as well as a memory issue on the server side?

The new push options design is actually neat in the way that the client exactly says what it wants and the server can reject early, but not cluttering the capability advertisement.

Thanks, Stefan

Previous: Jeff KingNext: Jeff King
Message 13 of 31 in “[PATCHv3 0/4] Push options in C Git”
  1. Stefan BellerJul 7, 2016
  2. 2/4 receive-pack: implement advertising and receiving push optionsStefan Beller, Jul 7, 2016
  3. Junio C HamanoJul 7, 2016
  4. Stefan BellerJul 7, 2016
  5. Jeff KingJul 7, 2016
  6. Stefan BellerJul 7, 2016
  7. Jeff KingJul 7, 2016
  8. Junio C HamanoJul 7, 2016
  9. Jonathan NiederJul 8, 2016
  10. Junio C HamanoJul 8, 2016
  11. Stefan BellerJul 8, 2016
  12. Jeff KingJul 8, 2016
  13. Stefan BellerJul 8, 2016
  14. Jeff KingJul 8, 2016
  15. Stefan BellerJul 8, 2016
  16. Jeff KingJul 8, 2016
  17. Stefan BellerJul 8, 2016
  18. Jeff KingJul 8, 2016
  19. Stefan BellerJul 8, 2016
  20. 3/4 push: accept push optionsStefan Beller, Jul 7, 2016
  21. Junio C HamanoJul 7, 2016
  22. Stefan BellerJul 8, 2016
  23. Junio C HamanoJul 11, 2016
  24. 1/4 push options: {pre,post}-receive hook learns about push optionsStefan Beller, Jul 7, 2016
  25. Junio C HamanoJul 7, 2016
  26. Stefan BellerJul 7, 2016
  27. Junio C HamanoJul 7, 2016
  28. 4/4 add a test for push optionsStefan Beller, Jul 7, 2016
  29. Junio C HamanoJul 7, 2016
  30. Junio C HamanoJul 7, 2016
  31. Stefan BellerJul 7, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.