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

Re: [PATCH v3] blame: prevent error if range ends past end of file

From
Isabella Stephens <istephens@atlassian.com>
Date
Oct 27, 2017, 06:18 UTC
Message-ID
<926900b8-1aad-b02a-b3c6-2bc4930233fd@atlassian.com>
In-Reply-To
<xmqqzi8dcpx1.fsf@gitster.mtv.corp.google.com>
On 27/10/17 12:58 pm, Junio C Hamano wrote:
Show 35 quoted lines
> Isabella Stephens <istephens@atlassian.com> writes:
> 
>> diff --git a/builtin/blame.c b/builtin/blame.c
>> index 67adaef4d..b5b9db147 100644
>> --- a/builtin/blame.c
>> +++ b/builtin/blame.c
>> @@ -878,13 +878,13 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
>>  				    nth_line_cb, &sb, lno, anchor,
>>  				    &bottom, &top, sb.path))
>>  			usage(blame_usage);
>> -		if (lno < top || ((lno || bottom) && lno < bottom))
>> +		if ((lno || bottom) && lno < bottom)
>>  			die(Q_("file %s has only %lu line",
>>  			       "file %s has only %lu lines",
>>  			       lno), path, lno);
>>  		if (bottom < 1)
>>  			bottom = 1;
>> -		if (top < 1)
>> +		if (top < 1 || lno < top)
>>  			top = lno;
> 
> This section sanity-checks first and then tweaks the values it
> allowed to pass the check.  Because it wants to later fix up an
> overly large "top" by capping to "lno" (i.e. total line number), the
> patch needs to loosen the early sanity-check.  And the "fixed up"
> values are never checked if they are sane.
> 
> For example, with an empty file (i.e. lno == 0), you can ask "git
> blame -L1,-4 ("i.e. "at most four lines, ending at line #1") and the
> code silently accepts the input without noticing that the request is
> an utter nonsense; "file X has only 0 lines" error is given a chance
> to kick in.
> 
> There should be an "is the range sensible?" check after all the
> tweaking to bottom and top are done, I think.

My mistake. I missed that case. I think this section of code is a little hard to read because it avoids treating an empty file as a special case. Why not do something like this:

  for (range_i = 0; range_i < range_list.nr; ++range_i) {
          long bottom, top;
          if (!lno)
                  die(_("file is empty"));
          if (parse_range_arg(range_list.items[range_i].string,
                              nth_line_cb, &sb, lno, anchor,
                              &bottom, &top, sb.path))
                  usage(blame_usage);
          if (bottom < 1)
                  bottom = 1;
          if (lno < top)
                  top = lno;
          if (top < 0 || lno < bottom)
                   die(Q_("file %s has only %lu line",
                         "file %s has only %lu lines",
                         lno), path, lno);
          bottom--;
          range_set_append_unsafe(&ranges, bottom, top);
          anchor = top + 1;
We'd also need to change parse_range_arg to always make bottom less than top:
-       if (*begin && *end && *end < *begin) {
+       if (*end < *begin) {
                SWAP(*end, *begin);
        }

This also fixes the case where the given range is n,-(n+1) (e.g. -L1,-2). At the moment that will blame from n to the end of the file. My suggested change would instead blame the first n lines, which makes a lot more sense IMO.

Happy to leave as is if you aren't happy with this suggestion, however.
Previous: Junio C HamanoNext: Eric Sunshine
Message 11 of 27 in “blame: add --fuzzy-lines command line option”
  1. blame: add --fuzzy-lines command line optionIsabella Stephens, Oct 26, 2017
  2. Junio C HamanoOct 26, 2017
  3. blame: prevent error if range ends past end of fileIsabella Stephens, Oct 26, 2017
  4. Jacob KellerOct 26, 2017
  5. Isabella StephensOct 26, 2017
  6. SZEDER GáborOct 26, 2017
  7. Isabella StephensOct 26, 2017
  8. blame: prevent error if range ends past end of fileIsabella Stephens, Oct 27, 2017
  9. Junio C HamanoOct 27, 2017
  10. Junio C HamanoOct 27, 2017
  11. Isabella StephensOct 27, 2017
  12. Eric SunshineOct 27, 2017
  13. 0/2 blame and log: prevent error if range ends past end of fileistephens@atlassian.com, Apr 26, 2018
  14. 1/2 blame: prevent error if range ends past end of fileistephens@atlassian.com, Apr 26, 2018
  15. Junio C HamanoApr 27, 2018
  16. Isabella StephensApr 27, 2018
  17. Junio C HamanoApr 27, 2018
  18. Isabella StephensApr 27, 2018
  19. Junio C HamanoMay 2, 2018
  20. 0/2 blame and log: prevent error if range ends past end of fileistephens@atlassian.com, May 29, 2018
  21. blame: prevent error if range ends past end of fileistephens@atlassian.com, May 29, 2018
  22. Eric SunshineMay 30, 2018
  23. Isabella StephensMay 31, 2018
  24. log: prevent error if line range ends past end of fileistephens@atlassian.com, May 29, 2018
  25. Eric SunshineMay 30, 2018
  26. 2/2 log: prevent error if line range ends past end of fileistephens@atlassian.com, Apr 26, 2018
  27. Isabella StephensOct 26, 2017

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.