{"thread":{"id":"35245","subject":"[PATCH] cvsserver: Determinize output to combat Perl 5.18 hash randomization","startedAt":"2013-10-30T08:44:43Z","lastAt":"2013-10-30T17:30:46Z","messageCount":2,"participants":["Anders Kaseorg","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"229799","messageId":"alpine.DEB.2.00.1310300413430.20647@dr-wily.mit.edu","threadId":"35245","inReplyTo":null,"subject":"[PATCH] cvsserver: Determinize output to combat Perl 5.18 hash randomization","fromName":"Anders Kaseorg","fromEmail":"andersk@mit.edu","sentAt":"2013-10-30T08:44:43Z","receivedAt":"2013-10-30T08:44:43Z","isPatch":true,"sender":{"key":"andersk@mit.edu","avatar":"https://avatars.githubusercontent.com/u/26471?v=4"},"body":"Perl 5.18 randomizes the seed used by its hash function, so iterating\nthrough hashes results in different orders from run to run:\n  http://perldoc.perl.org/perl5180delta.html#Hash-overhaul\n\nThis usually broke t9400 (gitcvs.dbname, gitcvs.ext.dbname, when\nrunning cmp on two .sqlite files) and t9402 (check [cvswork3] diff,\nwhen running test_cmp on two diffs).\n\nTo fix this, hide the internal order of hashes with sort when sending\noutput or running database queries.\n\n(An alternative workaround is PERL_HASH_SEED=0, but this seems nicer.)\n\nSigned-off-by: Anders Kaseorg <andersk@mit.edu>\n---\n git-cvsserver.perl | 10 +++++-----\n 1 file changed, 5 insertions(+), 5 deletions(-)\n\ndiff --git a/git-cvsserver.perl b/git-cvsserver.perl\nindex 67b1e7b..6177f4a 100755\n--- a/git-cvsserver.perl\n+++ b/git-cvsserver.perl\n@@ -430,10 +430,10 @@ sub req_validrequests\n \n     $log->debug(\"req_validrequests\");\n \n-    $log->debug(\"SEND : Valid-requests \" . join(\" \",keys %$methods));\n+    $log->debug(\"SEND : Valid-requests \" . join(\" \",sort keys %$methods));\n     $log->debug(\"SEND : ok\");\n \n-    print \"Valid-requests \" . join(\" \",keys %$methods) . \"\\n\";\n+    print \"Valid-requests \" . join(\" \",sort keys %$methods) . \"\\n\";\n     print \"ok\\n\";\n }\n \n@@ -2124,7 +2124,7 @@ sub req_diff\n             print \"M retrieving revision $meta2->{revision}\\n\"\n         }\n         print \"M diff \";\n-        foreach my $opt ( keys %{$state->{opt}} )\n+        foreach my $opt ( sort keys %{$state->{opt}} )\n         {\n             if ( ref $state->{opt}{$opt} eq \"ARRAY\" )\n             {\n@@ -4050,7 +4050,7 @@ sub update\n             close FILELIST;\n \n             # Detect deleted files\n-            foreach my $file ( keys %$head )\n+            foreach my $file ( sort keys %$head )\n             {\n                 unless ( exists $seen_files->{$file} or $head->{$file}{filehash} eq \"deleted\" )\n                 {\n@@ -4078,7 +4078,7 @@ sub update\n     }\n \n     $self->delete_head();\n-    foreach my $file ( keys %$head )\n+    foreach my $file ( sort keys %$head )\n     {\n         $self->insert_head(\n             $file,\n-- \n1.8.4.1\n"},{"id":"229836","messageId":"xmqqeh72d5tk.fsf@gitster.dls.corp.google.com","threadId":"35245","inReplyTo":"alpine.DEB.2.00.1310300413430.20647@dr-wily.mit.edu","subject":"Re: [PATCH] cvsserver: Determinize output to combat Perl 5.18 hash randomization","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-10-30T17:30:46Z","receivedAt":"2013-10-30T17:30:46Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Anders Kaseorg <andersk@MIT.EDU> writes:\n\n> Perl 5.18 randomizes the seed used by its hash function, so iterating\n> through hashes results in different orders from run to run:\n>   http://perldoc.perl.org/perl5180delta.html#Hash-overhaul\n>\n> This usually broke t9400 (gitcvs.dbname, gitcvs.ext.dbname, when\n> running cmp on two .sqlite files) and t9402 (check [cvswork3] diff,\n> when running test_cmp on two diffs).\n>\n> To fix this, hide the internal order of hashes with sort when sending\n> output or running database queries.\n>\n> (An alternative workaround is PERL_HASH_SEED=0, but this seems nicer.)\n>\n> Signed-off-by: Anders Kaseorg <andersk@mit.edu>\n\nThanks, will queue.\n\n> ---\n>  git-cvsserver.perl | 10 +++++-----\n>  1 file changed, 5 insertions(+), 5 deletions(-)\n>\n> diff --git a/git-cvsserver.perl b/git-cvsserver.perl\n> index 67b1e7b..6177f4a 100755\n> --- a/git-cvsserver.perl\n> +++ b/git-cvsserver.perl\n> @@ -430,10 +430,10 @@ sub req_validrequests\n>  \n>      $log->debug(\"req_validrequests\");\n>  \n> -    $log->debug(\"SEND : Valid-requests \" . join(\" \",keys %$methods));\n> +    $log->debug(\"SEND : Valid-requests \" . join(\" \",sort keys %$methods));\n>      $log->debug(\"SEND : ok\");\n>  \n> -    print \"Valid-requests \" . join(\" \",keys %$methods) . \"\\n\";\n> +    print \"Valid-requests \" . join(\" \",sort keys %$methods) . \"\\n\";\n>      print \"ok\\n\";\n>  }\n>  \n> @@ -2124,7 +2124,7 @@ sub req_diff\n>              print \"M retrieving revision $meta2->{revision}\\n\"\n>          }\n>          print \"M diff \";\n> -        foreach my $opt ( keys %{$state->{opt}} )\n> +        foreach my $opt ( sort keys %{$state->{opt}} )\n>          {\n>              if ( ref $state->{opt}{$opt} eq \"ARRAY\" )\n>              {\n> @@ -4050,7 +4050,7 @@ sub update\n>              close FILELIST;\n>  \n>              # Detect deleted files\n> -            foreach my $file ( keys %$head )\n> +            foreach my $file ( sort keys %$head )\n>              {\n>                  unless ( exists $seen_files->{$file} or $head->{$file}{filehash} eq \"deleted\" )\n>                  {\n> @@ -4078,7 +4078,7 @@ sub update\n>      }\n>  \n>      $self->delete_head();\n> -    foreach my $file ( keys %$head )\n> +    foreach my $file ( sort keys %$head )\n>      {\n>          $self->insert_head(\n>              $file,\n"}]}