Skip to contentSkip to conversation

git am with MIME

DISCUSSION Lea Wiemann 4 participants 6 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

There's still a problem with git am on the current next branch (which includes the recent "mailinfo: re-fix MIME multipart boundary parsing" patch):

$ wcat -q
'http://article.gmane.org/gmane.comp.version-control.git/91305/raw' | git am
fatal: `pos + len' is too far after the end of the buffer
$

It seems to be because of the (unusual?) way the patch uses MIME. Just wanted to post this so it doesn't get lost.

-- Lea

#1 lore raw
Quoted 7 lines · Lea Wiemann
$ wcat -q
'http://article.gmane.org/gmane.comp.version-control.git/91305/raw' | git am
fatal: `pos + len' is too far after the end of the buffer
$

It seems to be because of the (unusual?) way the patch uses MIME. Just wanted to post this so it doesn't get lost.

It's the From header actually. The patch below should fix it (though it sure makes that line of code ugly -- improvements are welcome).

-- >8 --
mailinfo: avoid violating strbuf assertion

In handle_from, we calculate the end boundary of a section to remove from a strbuf using strcspn like this:

  el = strcspn(buf, set_of_end_boundaries);
  strbuf_remove(&sb, start, el + 1);

This works fine if "el" is the offset of the boundary character, meaning we remove that character. But if the end boundary didn't match (that is, we hit the end of the string as the boundary instead) then we want just "el".

This manifested itself when we got a 'From' header that had just an email address with nothing else in it (the end of the string was the end of the address, rather than, e.g., a trailing '>' character).

---
 builtin-mailinfo.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
builtin-mailinfo.c +1 -1
index 26d3e5d..e890f7a 100644
@@ -107,7 +107,7 @@ static void handle_from(const struct strbuf *from)
 	el = strcspn(at, " \n\t\r\v\f>");
 	strbuf_reset(&email);
 	strbuf_add(&email, at, el);
-	strbuf_remove(&f, at - f.buf, el + 1);
+	strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));
 
 	/* The remainder is name.  It could be "John Doe <john.doe@xz>"
 	 * or "john.doe@xz (John Doe)", but we have removed the
Signature · 1 line
1.6.0.96.g2fad1.dirty
#2 lore raw

Jeff King, Tue, Aug 19, 2008 19:07:31 +0200:

builtin-mailinfo.c static void handle_from(const struct strbuf *from) · line 111

Quoted 8 lines · Lea Wiemann
builtin-mailinfo.c +1 -1
@@ -107,7 +107,7 @@ static void handle_from(const struct strbuf *from)
 	el = strcspn(at, " \n\t\r\v\f>");
 	strbuf_reset(&email);
 	strbuf_add(&email, at, el);
-	strbuf_remove(&f, at - f.buf, el + 1);
+	strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));
 

+ strbuf_remove(&f, at - f.buf, el + !!at[el]);

(Some people'll kill me for that :)

#3 lore raw
Quoted 5 lines · Alex Riesen

builtin-mailinfo.c static void handle_from(const struct strbuf *from) · line 110

Quoted 2 lines
builtin-mailinfo.c +1 -1
-	strbuf_remove(&f, at - f.buf, el + 1);
+	strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));

+ strbuf_remove(&f, at - f.buf, el + !!at[el]);

(Some people'll kill me for that :)

Ewwww. ;)

-Peff

#4 lore raw
In reply to Alex Riesen
Quoted 13 lines · Alex Riesen <raa.lkml <at> gmail.com> writes:

Jeff King, Tue, Aug 19, 2008 19:07:31 +0200:

builtin-mailinfo.c static void handle_from(const struct strbuf *from) · line 111

Quoted 8 lines · Lea Wiemann
builtin-mailinfo.c +1 -1
@@ -107,7 +107,7 @@ static void handle_from(const struct strbuf *from)
 	el = strcspn(at, " \n\t\r\v\f>");
 	strbuf_reset(&email);
 	strbuf_add(&email, at, el);
-	strbuf_remove(&f, at - f.buf, el + 1);
+	strbuf_remove(&f, at - f.buf, el + (at[el] ? 1 : 0));
 

+ strbuf_remove(&f, at - f.buf, el + !!at[el]);

Quoted 1 line

(Some people'll kill me for that :)

And why shouldn't they when:

	strbuf_remove(&f, at - f.buf, el + (at[el] != 0));

is infinitely better in every possible way? ;)

#5 lore raw

2008/8/21 Eric Raible <[email protected]>:

Quoted 8 lines
Quoted 1 line · Alex Riesen <raa.lkml <at> gmail.com> writes:

(Some people'll kill me for that :)

And why shouldn't they when:

       strbuf_remove(&f, at - f.buf, el + (at[el] != 0));

is infinitely better in every possible way? ;)

Because that's just as ugly as "?:", brackets and all