git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "René Scharfe" <rene.scharfe@lsrfire.ath.cx>
To: Bobby Powers <bobbypowers@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] diff --no-index: reset temporary buffer lengths on directory iteration
Date: Wed, 16 May 2012 08:33:38 +0200	[thread overview]
Message-ID: <4FB34A42.60300@lsrfire.ath.cx> (raw)
In-Reply-To: <1337141693-3515-1-git-send-email-bobbypowers@gmail.com>

Am 16.05.2012 06:14, schrieb Bobby Powers:
> Commit 875b91b3 introduced a regression when using diff --no-index
> with directories.  When iterating through a directory, the switch to
> strbuf from heap-allocated char arrays caused paths to form like
> 'dir/file1', 'dir/file1file2', rather than 'dir/file1', 'dir/file2' as
> expected.  By resetting the length on each iteration (but not
> buf.alloc), we avoid this.
>
> Signed-off-by: Bobby Powers <bobbypowers@gmail.com>
> ---
>  diff-no-index.c |    7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)

Nice catch!  Could you please also add a test case so that we can be 
sure a similar bug is not reintroduced later?

> diff --git a/diff-no-index.c b/diff-no-index.c
> index b44473e..bec3ea4 100644
> --- a/diff-no-index.c
> +++ b/diff-no-index.c
> @@ -67,7 +67,7 @@ static int queue_diff(struct diff_options *o,
>  		struct strbuf buffer2 = STRBUF_INIT;
>  		struct string_list p1 = STRING_LIST_INIT_DUP;
>  		struct string_list p2 = STRING_LIST_INIT_DUP;
> -		int i1, i2, ret = 0;
> +		int len1 = 0, len2 = 0, i1, i2, ret = 0;
>
>  		if (name1 && read_directory(name1, &p1))
>  			return -1;
> @@ -80,18 +80,23 @@ static int queue_diff(struct diff_options *o,
>  			strbuf_addstr(&buffer1, name1);
>  			if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/')
>  				strbuf_addch(&buffer1, '/');
> +			len1 = buffer1.len;
>  		}
>
>  		if (name2) {
>  			strbuf_addstr(&buffer2, name2);
>  			if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/')
>  				strbuf_addch(&buffer2, '/');
> +			len2 = buffer2.len;
>  		}
>
>  		for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) {
>  			const char *n1, *n2;
>  			int comp;

If you declare len1 and len2 right here at the start of the loop and 
reset the strbufs at its end, you wouldn't have to initialize them to 
zero and they'd have the right scope for their task.

Using type size_t, the type used in struct strbuf, is more correct.

>
> +			buffer1.len = len1;
> +			buffer2.len = len2;

It's cleaner to use strbuf_setlen() instead of setting the len member 
directly.

Looking at the code, I think the strbufs are never freed and the 
strbuf_reset() calls after the loop should be replaced by ones to 
strbuf_release() in order to avoid leaking.  This is a different issue, 
but would be nice to squash as well.

> +
>  			if (i1 == p1.nr)
>  				comp = 1;
>  			else if (i2 == p2.nr)
> -- 1.7.10.2
>

  reply	other threads:[~2012-05-16  6:34 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-16  4:14 [PATCH] diff --no-index: reset temporary buffer lengths on directory iteration Bobby Powers
2012-05-16  6:33 ` René Scharfe [this message]
2012-05-16 14:20   ` Bobby Powers
2012-05-16 14:28     ` [PATCH v2] " Bobby Powers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FB34A42.60300@lsrfire.ath.cx \
    --to=rene.scharfe@lsrfire.ath.cx \
    --cc=bobbypowers@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).