From: Junio C Hamano <gitster@pobox.com>
To: Daniel Barkalow <barkalow@iabervon.org>
Cc: Johannes Schindelin <Johannes.Schindelin@gmx.de>,
gitster@pobox.com, git@vger.kernel.org
Subject: Re: [PATCH] alloc_ref(): allow for trailing NUL
Date: Fri, 28 Sep 2007 01:46:13 -0700 [thread overview]
Message-ID: <7vhclfqisq.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <Pine.LNX.4.64.0709280046241.5926@iabervon.org> (Daniel Barkalow's message of "Fri, 28 Sep 2007 01:03:46 -0400 (EDT)")
Daniel Barkalow <barkalow@iabervon.org> writes:
> On Fri, 28 Sep 2007, Johannes Schindelin wrote:
>
>> The parameter name "namelen" suggests that you pass the equivalent of
>> strlen() to the function alloc_ref(). However, this function did not
>> allocate enough space to put a NUL after the name.
>>
>> Since struct ref does not have any member to describe the length of the
>> string, this just does not make sense.
>>
>> So make space for the NUL.
>
> Good point, but shouldn't you then fix call sites that use strlen(name) +
> 1?
Good point.
I audited "git grep -A2 -B4 -e alloc_ref next master" output,
and it appears almost everybody knows alloc_ref() wants the
caller to count the terminating NUL.
There however are a few gotchas.
* There is one overallocation in connect.c, which would not
hurt but is wasteful;
* next:transport.c has alloc_ref(strlen(e->name)) which is a
no-no;
Discarding Johannes's patch, the following would fix it.
---
connect.c | 4 ++--
transport.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/connect.c b/connect.c
index 06d279e..3d5c4ab 100644
--- a/connect.c
+++ b/connect.c
@@ -72,9 +72,9 @@ struct ref **get_remote_heads(int in, struct ref **list,
continue;
if (nr_match && !path_match(name, nr_match, match))
continue;
- ref = alloc_ref(len - 40);
+ ref = alloc_ref(name_len + 1);
hashcpy(ref->old_sha1, old_sha1);
- memcpy(ref->name, buffer + 41, len - 40);
+ memcpy(ref->name, buffer + 41, name_len + 1);
*list = ref;
list = &ref->next;
}
diff --git a/transport.c b/transport.c
index 4f9cddc..3475cca 100644
--- a/transport.c
+++ b/transport.c
@@ -215,7 +215,7 @@ static struct ref *get_refs_from_bundle(const struct transport *transport)
die ("Could not read bundle '%s'.", transport->url);
for (i = 0; i < data->header.references.nr; i++) {
struct ref_list_entry *e = data->header.references.list + i;
- struct ref *ref = alloc_ref(strlen(e->name));
+ struct ref *ref = alloc_ref(strlen(e->name) + 1);
hashcpy(ref->old_sha1, e->sha1);
strcpy(ref->name, e->name);
ref->next = result;
next prev parent reply other threads:[~2007-09-28 8:46 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-28 2:57 [PATCH] alloc_ref(): allow for trailing NUL Johannes Schindelin
2007-09-28 5:03 ` Daniel Barkalow
2007-09-28 8:46 ` Junio C Hamano [this message]
2007-09-28 12:01 ` Johannes Schindelin
2007-09-28 12:41 ` Pierre Habouzit
2007-09-28 13:13 ` Pierre Habouzit
2007-09-28 15:44 ` Daniel Barkalow
2007-09-28 16:11 ` Johannes Schindelin
2007-09-28 18:08 ` Junio C Hamano
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=7vhclfqisq.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=barkalow@iabervon.org \
--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).