On Fri, Mar 11, 2011 at 1:53 AM, Travis Williams <trav...@gmail.com> wrote:
> This codeĀ breaks, remove the flock and everything works great, I'm using the

Uh, it's the flock for sure. Simple test program (no PAR::Packer involved):

use Fcntl ':flock';
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

# part 1
my $zip = Archive::Zip->new();
$zip->read( 'fubar.zip' ) == AZ_OK or die "read zip: $!";
my $member = $zip->memberNamed("fubar.dll") or die "no member";

# part 2
open SELF, '<', 'fubar.zip' or die "open SELF: $!";
flock SELF, LOCK_EX | LOCK_NB or die "flock SELF: $!";

# part 3
my $filename = "3d2b5e28.dll";
open my $fh, '>', $filename or die "open: $!";
binmode($fh);

$member->extractToFileHandle($fh) == AZ_OK      #### croaks
    or die "extract: $! ($^E)";

close $fh;
print "extracted!\n";


It blows up in extractToFileHandle :(

Part 1 mimicks what goes on when you run your packed executable:
because of "use" statements (e.g. "use DBI") before your flock,
PAR has already opened the zip file that is your packed executable ($0).
It probably has also called memberNamed (and other) methods from
Archive::Zip. Note that DBD::ODBC has _not_ yet been extracted,
because it isn't mentioned in an explicit "use".

Part 2 is you flocking the zip file.

Part 3 mimcks what happens for "DBI->connect": it parses "dbi:ODBC:..."
and decides to dynamically load DBD::Oracle. This is intercepted by PAR
which locates the ODBC.dll in the zip and then tries to
read and decompress the corresponding bytes from the zip file.
But it is flocked now!
(So the strange IO error we saw is not from the filehandle
where the decompressed bytes should be finally written to, but
from the filehandle used to read the zip file.)

I suggest you use a file other than $0 for flocking, perhaps just create a dummy
file in the cache area (which is $ENV{PAR_TEMP}).

Cheers, Roderich

Reply via email to