threads / discuss / 9895

git-send-email creates duplicate Message-Id's

Subject: git-send-email creates duplicate Message-Id's

## tl;dr

3 messages between Sep 17, 2007 and Sep 17, 2007.

replies: 2people: 3as markdown or json

Adrian Bunk· Sep 17, 2007, 15:59 UTC · lore

The following might be a bug in git-send-email (git maintainers Cc'ed and KVM list removed from Cc):

Patch 54 got the same Message-Id as patch 61 and patch 89 got the same Message-Id as patch 104.

That's not legal, and users who automatically filter duplicate emails based on the Message-Id will not see two of the patches.

The emails are: http://marc.info/?l=linux-kernel&m=119002061330270&w=2 http://marc.info/?l=linux-kernel&m=119002059626434&w=2 http://marc.info/?l=linux-kernel&m=119002060011801&w=2 http://marc.info/?l=linux-kernel&m=119002060318915&w=2

cu Adrian

-- 
       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed
Junio C Hamano· Sep 17, 2007, 20:22 UTC · re: Adrian Bunk · lore

Re: git-send-email creates duplicate Message-Id's

Adrian Bunk <bunk@kernel.org> writes:
Show 11 quoted lines
> The following might be a bug in git-send-email (git maintainers Cc'ed
> and KVM list removed from Cc): 
>
> Patch 54 got the same Message-Id as patch 61 and patch 89 got the same 
> Message-Id as patch 104.
> ...
> The emails are:
> http://marc.info/?l=linux-kernel&m=119002061330270&w=2
> http://marc.info/?l=linux-kernel&m=119002059626434&w=2
> http://marc.info/?l=linux-kernel&m=119002060011801&w=2
> http://marc.info/?l=linux-kernel&m=119002060318915&w=2

The old code generated rand(4200) for each message and appended it to the timestamp. I do not know where the original author got 4200 from, but I think if you send many messages within a single second it is possible to get collisions.

I guess something like this patch is an improvement? It generates a single prefix from timestamp and random, and appends a number that is incremented for each message.

---
diff --git a/git-send-email.perl b/git-send-email.perl
index dd7560b..e250732 100755
--- a/git-send-email.perl
+++ b/git-send-email.perl
@@ -477,10 +477,18 @@ sub extract_valid_address {
 
 # We'll setup a template for the message id, using the "from" address:
 
+my ($message_id_stamp, $message_id_serial);
 sub make_message_id
 {
-	my $date = time;
-	my $pseudo_rand = int (rand(4200));
+	my $uniq;
+	if (!defined $message_id_stamp) {
+		$message_id_stamp = sprintf("%s-%s", time, int(rand(4200)));
+		$message_id_serial = 0;
+	}
+	$message_id_serial++;
+
+	$uniq = "$message_id_stamp-$message_id_serial";
+
 	my $du_part;
 	for ($sender, $repocommitter, $repoauthor) {
 		$du_part = extract_valid_address(sanitize_address($_));
@@ -490,8 +498,8 @@ sub make_message_id
 		use Sys::Hostname qw();
 		$du_part = 'user@' . Sys::Hostname::hostname();
 	}
-	my $message_id_template = "<%s-git-send-email-$du_part>";
-	$message_id = sprintf $message_id_template, "$date$pseudo_rand";
+	my $message_id_template = "<%s-git-send-email-%s>";
+	$message_id = sprintf($message_id_template, $uniq, $du_part);
 	#print "new message id = $message_id\n"; # Was useful for debugging
 }
 
Matti Aarnio· Sep 17, 2007, 20:47 UTC · re: Junio C Hamano · lore

Re: git-send-email creates duplicate Message-Id's

On Mon, Sep 17, 2007 at 01:22:05PM -0700, Junio C Hamano wrote:
Show 22 quoted lines
> Adrian Bunk <bunk@kernel.org> writes:
> 
> > The following might be a bug in git-send-email (git maintainers Cc'ed
> > and KVM list removed from Cc): 
> >
> > Patch 54 got the same Message-Id as patch 61 and patch 89 got the same 
> > Message-Id as patch 104.
> > ...
> > The emails are:
> > http://marc.info/?l=linux-kernel&m=119002061330270&w=2
> > http://marc.info/?l=linux-kernel&m=119002059626434&w=2
> > http://marc.info/?l=linux-kernel&m=119002060011801&w=2
> > http://marc.info/?l=linux-kernel&m=119002060318915&w=2
> 
> The old code generated rand(4200) for each message and appended
> it to the timestamp.  I do not know where the original author
> got 4200 from, but I think if you send many messages within a
> single second it is possible to get collisions.
> 
> I guess something like this patch is an improvement?  It
> generates a single prefix from timestamp and random, and appends
> a number that is incremented for each message.

Much better. You may also consider a possibility of letting your local MTA do the Message-ID generation, unless you are tracking something with it and thus need to know the generated values. .. but apparently git much prefers sending email by SMTP, where the message-id must be present, or one really should block any such emails.. (except that systems like qmail send error messages without message-id ...)

My own recipe is:
       sprintf("%d-%d-%d", time , getpid, ++localsequence)
catenate on that your favourite domain name where that recipe
is likely to be valid, and you are all set.
  /Matti Aarnio  --  one of  <postmaster@vger.kernel.org>

← back to recent threads