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

[PATCH] git-svn: workaround for a bug in svn serf backend

From
Roman Kagan <rkagan@mail.ru>
Date
Dec 26, 2013, 12:05 UTC
Message-ID
<1388059524-4864-1-git-send-email-rkagan@mail.ru>
In-Reply-To
<87ha9wdh8g.fsf@linux-1gf2.Speedport_W723_V_Typ_A_1_00_098>

Subversion serf backend in versions 1.8.5 and below has a bug that the function creating the descriptor of a file change -- add_file() -- doesn't make a copy of its 3d argument when storing it on the returned descriptor. As a result, by the time this field is used (in transactions of file copying or renaming) it may well be released.

This patch works around this bug, by storing the value to be passed as the 3d argument to add_file() in a local variable with the same scope as the file change descriptor, making sure their lifetime is the same.

Cc: Benjamin Pabst <benjamin.pabst85@gmail.com>
Cc: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Roman Kagan <rkagan@mail.ru>
---
 perl/Git/SVN/Editor.pm | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/perl/Git/SVN/Editor.pm b/perl/Git/SVN/Editor.pm
index b3bcd47..ae399c3 100644
--- a/perl/Git/SVN/Editor.pm
+++ b/perl/Git/SVN/Editor.pm
@@ -304,8 +304,12 @@ sub C {
 	my ($self, $m, $deletions) = @_;
 	my ($dir, $file) = split_path($m->{file_b});
 	my $pbat = $self->ensure_path($dir, $deletions);
+	# workaround for a bug in svn serf backend (v1.8.5 and below):
+	# store 3d argument to ->add_file() in a local variable, to make it
+	# have the same lifetime as $fbat
+	my $upa = $self->url_path($m->{file_a});
 	my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
-				$self->url_path($m->{file_a}), $self->{r});
+				$upa, $self->{r});
 	print "\tC\t$m->{file_a} => $m->{file_b}\n" unless $::_q;
 	$self->chg_file($fbat, $m);
 	$self->close_file($fbat,undef,$self->{pool});
@@ -323,8 +327,10 @@ sub R {
 	my ($self, $m, $deletions) = @_;
 	my ($dir, $file) = split_path($m->{file_b});
 	my $pbat = $self->ensure_path($dir, $deletions);
+	# workaround for a bug in svn serf backend, see comment in C() above
+	my $upa = $self->url_path($m->{file_a});
 	my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat,
-				$self->url_path($m->{file_a}), $self->{r});
+				$upa, $self->{r});
 	print "\tR\t$m->{file_a} => $m->{file_b}\n" unless $::_q;
 	$self->apply_autoprops($file, $fbat);
 	$self->chg_file($fbat, $m);
-- 
1.8.4.2
Previous: Thomas RastNext: Jonathan Nieder
Message 11 of 27 in “Fwd: Error with git-svn pushing a rename”
  1. Benjamin PabstNov 14, 2013
  2. Andreas StrickerNov 15, 2013
  3. Andreas StrickerNov 15, 2013
  4. Jonathan NiederNov 15, 2013
  5. Andreas StrickerNov 17, 2013
  6. Benjamin PabstNov 20, 2013
  7. Roman KaganDec 24, 2013
  8. Roman KaganDec 25, 2013
  9. Roman KaganDec 25, 2013
  10. Thomas RastDec 25, 2013
  11. git-svn: workaround for a bug in svn serf backendRoman Kagan, Dec 26, 2013
  12. Jonathan NiederDec 26, 2013
  13. Roman KaganDec 27, 2013
  14. Roman KaganDec 27, 2013
  15. git-svn: workaround for a bug in svn serf backendRoman Kagan, Dec 27, 2013
  16. Jonathan NiederDec 27, 2013
  17. Eric WongDec 27, 2013
  18. Junio C HamanoDec 27, 2013
  19. Roman KaganDec 28, 2013
  20. Junio C HamanoDec 30, 2013
  21. Roman KaganDec 31, 2013
  22. Roman KaganJan 17, 2014
  23. Junio C HamanoJan 17, 2014
  24. Andreas StrickerJan 6, 2014
  25. Thomas RastDec 30, 2013
  26. Roman KaganDec 30, 2013
  27. Benjamin PabstNov 18, 2013

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.