Re: [PATCH v9] show-branch: convert per-branch flags to commit-slab

Junio C Hamano <[email protected]>
Newsgroups org.kernel.vger.git
Message-ID <[email protected]>
Gatla Vishweshwar Reddy <[email protected]> writes:

> I took time to read through the code carefully before sending this.

Hmph.  I hate to say this, but I am finding it difficult to trust
your "carefully" at this point.

    $ make
    $ ./git show-branch master next
    Floating point exception (core dumped).

While I have not spent the time to exhaustively find all bugs in
this code [*], it is disturbing that the simplest use of the command
immediately crashes.  The reason for this crash is trivial.

>  static struct commit_name_slab name_slab;
>  
> +define_commit_slab(commit_rev_flags, uint64_t);
> +static struct commit_rev_flags rev_flags_slab;
> +static int flags_stride; /* number of uint64_t words per commit */
> +
>  static struct commit_name *commit_to_name(struct commit *commit)
>  {
>  	return *commit_name_slab_at(&name_slab, commit);
>  }

The code still uses name_slab to associate names with commits, and
commit_to_name() is called by functions like name_commits(), which
is used in cmd_show_branch().  Yet, the patch does this:

> @@ -713,8 +773,6 @@ int cmd_show_branch(int ac,
>  	const char **args_copy = NULL;
>  	int ret;
>  
> -	init_commit_name_slab(&name_slab);
> -

The code simply discards the initialization for that slab, leaving
name_slab BSS-initialized.  Consequently, all members in the struct
are initialized to 0, including the '.slab_size' member.

This init_commit_name_slab() call is not moved elsewhere; it simply
disappeared without an explanation.

When commit_to_name() tries to look up a commit in the slab, it
first attempts to determine which slab should contain the data for
the commit, using this code from <commit-slab-impl.h>:

scope elemtype *slabname## _at_peek(struct slabname *s,			\
						  const struct commit *c, \
						  int add_if_missing)   \
{									\
	unsigned int nth_slab, nth_slot;				\
									\
	nth_slab = c->index / s->slab_size;				\
	nth_slot = c->index % s->slab_size;				\
									\
And we all know what would happen when you divide by zero.



[Footnote]

 * ... and I will not.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.