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

[PATCH] diff-delta.c: make FLEX_ARRAY=1 work.

From
David Kastrup <dak@gnu.org>
Date
Dec 18, 2007, 01:32 UTC
Message-ID
<85wsrclqmi.fsf_-_@lola.goethe.zz>
In-Reply-To
<7vtzmg3j37.fsf@gitster.siamese.dyndns.org>

I remarked previously that diff-delta.c does not work with FLEX_ARRAY=1. Here is one attempt to change this. It conceivably still suffers from potential misalignment problems (which would likely need some union type magic to avoid 100%), but at least the index calculation should not go as horribly wrong as previously.

--- Junio C Hamano <gitster@pobox.com> writes:

Show 15 quoted lines
> "Shawn O. Pearce" <spearce@spearce.org> writes:
>
>> I'll try to track it down tomorrow.  But the immediate workaround was
>> to just add '-DFLEX_ARRAY=/* empty */' to my CFLAGS and recompile
>> the world.  This compiler accepts the empty FLEX_ARRAY macro but
>> I'm not sure what feature test(s) would be necessary to make Git
>> able to automatically set that, seeing as how the tests defined in
>> 8e97 are perfectly reasonable and didn't pass.
>> ..., but will try to come up with a reasonable
>> detection patch....
>
> Actually I would be more worried about the breakage in FLEX_ARRAY=1 case
> than misdetection.  Even if your compiler supports the flexible array
> members, the fallback to FLEX_ARRAY=1 ought to work and you are seeing a
> case where it doesn't.
 diff-delta.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/diff-delta.c b/diff-delta.c
index 9e440a9..099235c 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -247,7 +247,7 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
 	/* Now create the packed index in array form rather than
 	 * linked lists */
 
-	memsize = sizeof(*index)
+	memsize = (char *)&index->hash - (char *)index
 		+ sizeof(*packed_hash) * (hsize+1)
 		+ sizeof(*packed_entry) * entries;
 
@@ -264,7 +264,7 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
 	index->src_size = bufsize;
 	index->hash_mask = hmask;
 
-	mem = index + 1;
+	mem = &index->hash;
 	packed_hash = mem;
 	mem = packed_hash + (hsize+1);
 	packed_entry = mem;
-- 
1.5.3.6.995.ge8abd
Previous: Junio C Hamano
Message 3 of 3 in “FLEX_ARRAY=1 causes SIGSEGV on SPARC”
  1. Shawn O. PearceDec 18, 2007
  2. Junio C HamanoDec 18, 2007
  3. diff-delta.c: make FLEX_ARRAY=1 work.David Kastrup, Dec 18, 2007

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.