in reply to Re: Re: Archive::Tar Memory Consumption
in thread Archive::Tar Memory Consumption

OK, I've had time to look at it. I found the actual culprit, but at the same time, I found some more errors that affect other platforms as well.

The reason why it failed, is this snippet, at lines 237-239:

if ($^O eq "MSWin32") { $fh = $_[0]; }
where later on, this is done with it:
$fh = Compress::Zlib::gzdopen_ ($fh, $mode, 0)
gzdopen_ is a low level function in Compress::Zlib. Well, guess what: this function expect a fileno, not a handle. So this fails. This does _drat() (it should either goto &_drat; or return _drat();, but not just call _drat()). $! is not set, so $error isn't set to a true value, and that's why it fails in such an ungraceful way. But I digress.

The solution is simple: set

if ($^O eq "MSWin32") { $fh = fileno($_[0]); }
instead. And now all tests succeed.

Here's the whole diff (for Archive-Tar-0.22.tar.gz):

--- Tar.pm Fri Apr 28 00:50:16 2000 +++ blib/lib/Archive/Tar.pm Sat Aug 24 15:06:04 2002 @@ -79,7 +79,7 @@ my $error; sub _drat { - $error = $! . ''; + $error = $! . '' || 'unknown error'; return; } @@ -235,7 +235,7 @@ or goto &_drat; if ($^O eq "MSWin32") { - $fh = $_[0]; + $fh = fileno($_[0]); } else { $fh = fcntl ($_[0], F_DUPFD, 0) @@ -248,7 +248,7 @@ # $fh = Compress::Zlib::gzopen ($_[0], $mode) # or &_drat; $fh = Compress::Zlib::gzdopen_ ($fh, $mode, 0) - or &_drat; + or goto &_drat; } else { $flags = fcntl ($_[0], F_GETFL, 0) & (O_RDONLY | O_WRONLY | O_RDWR +);

I'll try to warn the maintainer.