Thu Oct 25 13:26:52 2012: Request 80396 was acted upon.
Transaction: Ticket created by jfern...@mtu.edu
       Queue: libwin32
     Subject: Win32::Pipe fails to disconnect "server" pipes (fix included)
   Broken in: (no value)
    Severity: (no value)
       Owner: Nobody
  Requestors: jfern...@mtu.edu
      Status: new
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=80396 >


This problem seems to be at least 12 years old 
(http://code.activestate.com/lists/perl-win32-admin/313/). Do I get an award 
for oldest module bug found?

There is a bug in the arguments check in the call to Pipe::Disconnect in 
Pipe.xs which causes pipes to never be disconnected. 

This causes pipe servers which attempt to Disconnect() fail in their second 
call to Connect().

This is happening on v 0.024 of Win32::Pipe.
----
C:\>perl -v

This is perl 5, version 16, subversion 0 (v5.16.0) built for 
MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2012, Larry Wall

Binary build 1600 [295879] provided by ActiveState http://www.ActiveState.com
Built Jun 11 2012 12:43:38

----
Example code:

SERVER:

use Win32::Pipe;
 my $pipe = new Win32::Pipe("work"); 
  while(1) {
    $pipe->Connect() or die 'Connect';
    $pipe->Write('Test') or die "Error:".$pipe->Error();
    $pipe->Disconnect();
  }
}

CLIENT:

use Win32::Pipe;

my $pipe = new Win32::Pipe('\\\\.\\pipe\\work');

print $pipe->Read();
$pipe->Close();

my $pipe = new Win32::Pipe('\\\\.\\pipe\\work');

print $pipe->Read();
$pipe->Close();

The second call to Connect fails
----
Cause:

Line 307 of Pipe.xs reads:

        if(items > 0 && items < 3){
                CROAK("usage: Disconnect($PipeHandle [, $iPurge]);\n");
        }
which CROAKS() when the number of parameters is 1 or 2. The code is intended to 
accept 1 or 2 parameters, so the logic needs to be reversed, the code never 
gets to Pipe->Disconnect(iPurge):

        if(items < 1 || items > 2)){
                CROAK("usage: Disconnect($PipeHandle [, $iPurge]);\n");
        }
----
Diff:

bash-3.2# diff -u Pipe.xs.orig Pipe.xs 
--- Pipe.xs.orig        2012-10-23 14:43:57.000000000 -0400
+++ Pipe.xs     2012-10-23 14:44:26.000000000 -0400
@@ -304,7 +304,7 @@
        int             iResult = 0;
        int             iPurge = 0;

-       if(items > 0 && items < 3){
+       if(items < 1 || items > 2)){
                CROAK("usage: Disconnect($PipeHandle [, $iPurge]);\n");
        }
        Pipe = INT2PTR(class CPipe *, SvIV(ST(0)));

Reply via email to