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

Re: segfault for git log --graph --no-walk --grep a

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 11, 2013, 20:01 UTC
Message-ID
<7v621ymxfv.fsf@alter.siamese.dyndns.org>
In-Reply-To
<20130211191607.GA21269@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
Show 16 quoted lines
> On Fri, Feb 08, 2013 at 04:47:01PM -0800, Junio C Hamano wrote:
>
>> > Yeah, that actually is a good point.  We should be using logmsg_reencode
>> > so that we look for strings in the user's encoding.
>> 
>> Perhaps like this.  Just like the previous one (which should be
>> discarded), this makes the function always use the temporary strbuf,
>> so doing this upfront actually loses more code than it adds ;-)
>
> I didn't see this in What's Cooking or pu. We should probably pick an
> approach and go with it.
>
> I think using logmsg_reencode makes sense. I'd be in favor of avoiding
> the extra copy in the common case, so something like the patch below. If
> you feel strongly about the code cleanup at the minor run-time expense,
> I won't argue too much, though.
Sounds good to me.  Care to do the log message while at it?
Show 66 quoted lines
> ---
> diff --git a/revision.c b/revision.c
> index d7562ee..a08d0a5 100644
> --- a/revision.c
> +++ b/revision.c
> @@ -2268,7 +2268,10 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
>  static int commit_match(struct commit *commit, struct rev_info *opt)
>  {
>  	int retval;
> +	const char *encoding;
> +	const char *message;
>  	struct strbuf buf = STRBUF_INIT;
> +
>  	if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
>  		return 1;
>  
> @@ -2279,13 +2282,23 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
>  		strbuf_addch(&buf, '\n');
>  	}
>  
> +	/*
> +	 * We grep in the user's output encoding, under the assumption that it
> +	 * is the encoding they are most likely to write their grep pattern
> +	 * for. In addition, it means we will match the "notes" encoding below,
> +	 * so we will not end up with a buffer that has two different encodings
> +	 * in it.
> +	 */
> +	encoding = get_log_output_encoding();
> +	message = logmsg_reencode(commit, encoding);
> +
>  	/* Copy the commit to temporary if we are using "fake" headers */
>  	if (buf.len)
> -		strbuf_addstr(&buf, commit->buffer);
> +		strbuf_addstr(&buf, message);
>  
>  	if (opt->grep_filter.header_list && opt->mailmap) {
>  		if (!buf.len)
> -			strbuf_addstr(&buf, commit->buffer);
> +			strbuf_addstr(&buf, message);
>  
>  		commit_rewrite_person(&buf, "\nauthor ", opt->mailmap);
>  		commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap);
> @@ -2294,18 +2307,18 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
>  	/* Append "fake" message parts as needed */
>  	if (opt->show_notes) {
>  		if (!buf.len)
> -			strbuf_addstr(&buf, commit->buffer);
> -		format_display_notes(commit->object.sha1, &buf,
> -				     get_log_output_encoding(), 1);
> +			strbuf_addstr(&buf, message);
> +		format_display_notes(commit->object.sha1, &buf, encoding, 1);
>  	}
>  
> -	/* Find either in the commit object, or in the temporary */
> +	/* Find either in the original commit message, or in the temporary */
>  	if (buf.len)
>  		retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
>  	else
>  		retval = grep_buffer(&opt->grep_filter,
> -				     commit->buffer, strlen(commit->buffer));
> +				     message, strlen(message));
>  	strbuf_release(&buf);
> +	logmsg_free(message, commit);
>  	return retval;
>  }
>  
Previous: Jeff KingNext: Junio C Hamano
Message 10 of 26 in “segfault for git log --graph --no-walk --grep a”
  1. Thomas HallerFeb 8, 2013
  2. Junio C HamanoFeb 9, 2013
  3. Junio C HamanoFeb 9, 2013
  4. Jeff KingFeb 9, 2013
  5. Junio C HamanoFeb 9, 2013
  6. Junio C HamanoFeb 9, 2013
  7. Jeff KingFeb 9, 2013
  8. Jeff KingFeb 9, 2013
  9. Jeff KingFeb 11, 2013
  10. Junio C HamanoFeb 11, 2013
  11. Junio C HamanoFeb 11, 2013
  12. Jeff KingFeb 11, 2013
  13. Junio C HamanoFeb 11, 2013
  14. log: re-encode commit messages before greppingJeff King, Feb 11, 2013
  15. Junio C HamanoFeb 11, 2013
  16. Jeff KingFeb 11, 2013
  17. t4210-log-i18n: spell encoding name "UTF-8" correctlyJohannes Sixt, Feb 25, 2013
  18. Jeff KingFeb 25, 2013
  19. Junio C HamanoFeb 25, 2013
  20. Jeff KingFeb 25, 2013
  21. Johannes SixtFeb 26, 2013
  22. Torsten BögershausenFeb 25, 2013
  23. Torsten BögershausenFeb 25, 2013
  24. Jeff KingFeb 25, 2013
  25. Junio C HamanoFeb 9, 2013
  26. Jeff KingFeb 9, 2013

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.