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

Re: [PATCH] parse_tag_buffer(): do not prefixcmp() out of range

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 15, 2011, 21:18 UTC
Message-ID
<7vsjvpm1xh.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1297688571-1962-1-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy <pclouds@gmail.com> writes:
Show 6 quoted lines
> There is a check (size < 64) at the beginning of the function, but
> that only covers object+type lines.
>
> Strictly speaking the current code is still correct even if it
> accesses outside 'data' because 'tail' is used right after
> prefixcmp() calls.
What do you mean by this?  I don't get it.
Show 15 quoted lines
> diff --git a/tag.c b/tag.c
> index ecf7c1e..9318ae5 100644
> --- a/tag.c
> +++ b/tag.c
> @@ -97,7 +97,9 @@ int parse_tag_buffer(struct tag *item, const void *data, unsigned long size)
>  		item->tagged = NULL;
>  	}
>  
> -	if (prefixcmp(bufptr, "tag "))
> +	if (bufptr + 4 < tail && !prefixcmp(bufptr, "tag "))
> +		; 		/* good */
> +	else
>  		return -1;
>  	bufptr += 4;
>  	nl = memchr(bufptr, '\n', tail - bufptr);

If there weren't enough bytes between bufptr and tail, prefixcmp may still match with "tag " while later part of the matched string might be coming from trailing garbage outside our memory. Unless we correctly fail the prefixcmp() part, memchr() would be fed negative value, no?

Previous: Nguyễn Thái Ngọc DuyNext: Nguyen Thai Ngoc Duy
Message 6 of 9 in “Add const to parse_{commit,tag}_buffer()”
  1. 1/2 Add const to parse_{commit,tag}_buffer()Nguyễn Thái Ngọc Duy, Feb 5, 2011
  2. 2/2 Make hash-object more robust against malformed objectsNguyễn Thái Ngọc Duy, Feb 5, 2011
  3. Thomas RastFeb 12, 2011
  4. Nguyen Thai Ngoc DuyFeb 12, 2011
  5. parse_tag_buffer(): do not prefixcmp() out of rangeNguyễn Thái Ngọc Duy, Feb 14, 2011
  6. Junio C HamanoFeb 15, 2011
  7. Nguyen Thai Ngoc DuyFeb 16, 2011
  8. René ScharfeFeb 17, 2011
  9. parse_tag_buffer(): avoid out of bound accessNguyễn Thái Ngọc Duy, Feb 18, 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.