The reason why it failed, is this snippet, at lines 237-239:
where later on, this is done with it:if ($^O eq "MSWin32") { $fh = $_[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.$fh = Compress::Zlib::gzdopen_ ($fh, $mode, 0)
The solution is simple: set
instead. And now all tests succeed.if ($^O eq "MSWin32") { $fh = fileno($_[0]); }
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.
In reply to Re: Re: Re: Archive::Tar Memory Consumption
by bart
in thread Archive::Tar Memory Consumption
by arc_of_descent
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |