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

Re: [PATCHv2 2/2] receive-pack: Add receive.objectCountLimit to refuse push with too many objects

From
Shawn Pearce <spearce@spearce.org>
Date
May 14, 2011, 02:30 UTC
Message-ID
<BANLkTik_taBK+=nh+0WEUjp3AV_fC7e_dg@mail.gmail.com>
In-Reply-To
<201105140403.09981.johan@herland.net>
On Fri, May 13, 2011 at 19:03, Johan Herland <johan@herland.net> wrote:
> The new receive.objectCountLimit config variable defines an upper limit
> on the number of objects to accept in a single push. If the number of
> objects in a push exceeds this limit, the entire push is discarded
> without storing the pushed objects on the server at all.
...
Show 5 quoted lines
> +           ntohl(hdr.hdr_entries) > receive_object_count_limit) {
> +               char buf[1024];
> +               while (xread(0, buf, 1024) > 0)
> +                       ; /* nothing */
> +               return "received pack exceeds configured receive.objectCountLimit";

Discarding in core is painful. We are still consuming bandwidth to toss away the data.

I wonder... should we instead export the objectCountLimit as part of the advertisement to the client, and teach send-pack to look at this and pass it down to pack-objects? If pack-objects winds up with more than this limit, it aborts and the client doesn't even transmit data. Newer clients would abort cleanly with a nice error.

I don't see it as a problem to advertise to a client "This server will only accept X objects from you, sending X + 1 is an error and will be rejected." If we are worried about an evil client using this advertisement to try and DoS a server... he can easily do that with a single giant blob. Or a very long delta chain of a single blob and many, many tiny deltas applied onto it. Knowing what the remote's objectCountLimit is doesn't increase the risk of a DoS attack.

For older clients that don't know this new advertised capability, they should fail hard and not transfer all of this data. In my experience when a user gets these strange errors from his Git client, he contacts his server administrator with the screen output. At which point the administrator can see the Counting objects line, check the repository configuration, and tell the user what the problem is... and encourage them to upgrade their client to a newer version.

If we are going to put limits in, does it make sense to try and push these limits back to pack-objects in a more detailed way? You talked about depth of history, or size of pack. pack-objects could approximate both. If its depth of history, it might even be able to cut off before it enumerates too many commits. :-)

The remote side obviously cannot abort early with number of commits or pack size limits, but if those were soft limits suggested to a client, while the object count was a hard limit, you might get a better approximation for what you want. A server administrator might configure a soft limit of 10 commits, but a hard limit of 5,000 objects. For most users, a bad push would abort very early on the soft limit of 10 commits if they did an incorrect rebase. Meanwhile a user who made 1 commit but changed every GPL header in the linux-2.6 repository (26,000+ files) would also be stopped for exceeding the (hard) 5000 object limit.

-- 
Shawn.
Previous: Johan HerlandNext: Johan Herland
Message 5 of 53 in “receive-pack: Add receive.denyObjectLimit to refuse push with too many objects”
  1. 2/2 receive-pack: Add receive.denyObjectLimit to refuse push with too many objectsJohan Herland, May 13, 2011
  2. Junio C HamanoMay 13, 2011
  3. Johan HerlandMay 14, 2011
  4. 2/2 receive-pack: Add receive.objectCountLimit to refuse push with too many objectsJohan Herland, May 14, 2011
  5. Shawn PearceMay 14, 2011
  6. Johan HerlandMay 14, 2011
  7. Shawn PearceMay 14, 2011
  8. Johan HerlandMay 15, 2011
  9. 0/9 Push limitsJohan Herland, May 15, 2011
  10. 1/9 Update technical docs to reflect side-band-64k capability in receive-packJohan Herland, May 15, 2011
  11. 2/9 send-pack: Attempt to retrieve remote status even if pack-objects failsJohan Herland, May 15, 2011
  12. Jeff KingMay 16, 2011
  13. Jeff KingMay 16, 2011
  14. Jeff KingMay 16, 2011
  15. 1/3 connect: treat generic proxy processes like ssh processesJeff King, May 16, 2011
  16. Johannes SixtMay 16, 2011
  17. Junio C HamanoMay 16, 2011
  18. Jeff KingMay 17, 2011
  19. Johannes SixtMay 17, 2011
  20. Jeff KingMay 18, 2011
  21. 2/3 connect: let callers know if connection is a socketJeff King, May 16, 2011
  22. 3/3 send-pack: avoid deadlock on git:// push with failed pack-objectsJeff King, May 16, 2011
  23. Johannes SixtMay 16, 2011
  24. Jeff KingMay 17, 2011
  25. Windows: add a wrapper for the shutdown() system callJohannes Sixt, May 18, 2011
  26. 3/9 pack-objects: Allow --max-pack-size to be used together with --stdoutJohan Herland, May 15, 2011
  27. Shawn PearceMay 15, 2011
  28. Johan HerlandMay 16, 2011
  29. Junio C HamanoMay 16, 2011
  30. Johan HerlandMay 16, 2011
  31. 4/9 pack-objects: Teach new option --max-object-count, similar to --max-pack-sizeJohan Herland, May 15, 2011
  32. Shawn PearceMay 15, 2011
  33. Johan HerlandMay 15, 2011
  34. Shawn PearceMay 15, 2011
  35. Junio C HamanoMay 16, 2011
  36. Johan HerlandMay 16, 2011
  37. 5/9 pack-objects: Teach new option --max-commit-count, limiting #commits in packJohan Herland, May 15, 2011
  38. 6/9 receive-pack: Prepare for addition of the new 'limit-*' family of capabilitiesJohan Herland, May 15, 2011
  39. Junio C HamanoMay 16, 2011
  40. Johan HerlandMay 16, 2011
  41. Sverre RabbelierMay 16, 2011
  42. Junio C HamanoMay 16, 2011
  43. Sverre RabbelierMay 16, 2011
  44. Junio C HamanoMay 16, 2011
  45. Sverre RabbelierMay 16, 2011
  46. 7/9 send-pack/receive-pack: Allow server to refuse pushes with too many objectsJohan Herland, May 15, 2011
  47. 8/9 send-pack/receive-pack: Allow server to refuse pushing too large packsJohan Herland, May 15, 2011
  48. 9/9 send-pack/receive-pack: Allow server to refuse pushes with too many commitsJohan Herland, May 15, 2011
  49. Ævar Arnfjörð BjarmasonMay 15, 2011
  50. Junio C HamanoMay 14, 2011
  51. Shawn PearceMay 14, 2011
  52. Johannes SixtMay 13, 2011
  53. Johan HerlandMay 14, 2011

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.