Re: Perl syswrite and IO/SSL

Graham Barr <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.ldap
Message-ID <[email protected]>
On May 21, 2009, at 11:50 AM, Dale Moore wrote:

> Hi Graham,
>
> I believe that I've figured out this problem
> with syswrite returning 1 instead of the number of
> bytes actually written.
>
> The problem appears to be with Authen::SASL::Cyrus .

Unfortunately there are 2 different Authen::SASL::Cyrus
modules :-(, but I think you are using the one by Patrick Boettcher

As Patrick does not own the namespace his module is not easily found.

However, with his permission, I have created a rename of that module
and it is available on github at

http://github.com/gbarr/perl-authen-sasl-xs/tree

> In that module, they supply their own WRITE function
> in Authen::SASL::Cyrus::Security .  This WRITE function
> is called when syswrite is called with an LDAP connection
> that has been authenticated with Cyrus SASL.
>
> This WRITE function does not implement the standard
> syswrite semantics.  It's implementation is
> sub WRITE {
>  my($ref,$string,$len) = @_;
>  my($fh, $clearbuf, $cryptbuf);
>
>  $fh = $ref->{fh};
>  $clearbuf = substr($string, 0, $len);
>  $cryptbuf = $ref->{conn}->encode($clearbuf);
>  print $fh $cryptbuf;
> }

Yes that looks the same as

http://github.com/gbarr/perl-authen-sasl-xs/blob/91fb5bf011d3e6a345c6996141af71f563982040/lib/Authen/SASL/XS/Security.pm#L74

Authen::SASL needs to be modified to look for ::XS by default, but you  
can make it find it with

use Authen::SASL qw(XS Perl);

Any patches to Authen::SASL::XS would be welcome.

Graham.

> It does not handle offsets, and print returns
> TRUE on success (what I was seeing), and not the
> number of bytes.  This is a bug in Authen::SASL::Cyrus .
>
> If I avoid Cyrus Sasl, and use Perl SASL all is well
> and the problem does not persist.
>
> I appreciate your help in resolving this problem.
>
> Dale Moore
>
> -----Original Message-----
> From: Graham Barr [mailto:[email protected]]
> Sent: Tuesday, May 19, 2009 4:27 PM
> To: [email protected]
> Cc: [email protected]
> Subject: Re: Perl syswrite and IO/SSL
>
> On May 19, 2009, at 2:31 PM, Dale Moore wrote:
>> I am having a problem with LDAP.pm and wondering
>> if any other folks are experiencing similar problems.
>>
>> The problems are the result of code that was modified
>> in this patch
>>
>> http://git.goingon.net/?p=perl-ldap.git;a=commitdiff;h=8c6c9cfcb78adf229437507f2e8ffe86d15e712d
>>
>> There are some style issues that I don’t like about this patch.
>> - We do a length() call on each time through the loop rather than
>> once
>> - We do a substr call each time through the loop, which isnt
>> necessary
>>   if we would instead use the offset parameter to syswrite
>> - No reference in where the number 15000 came from.
>>
>> But the patch appears to basically sound, even if it does offend my
>> sense
>> of asthetics.
>
> Patches welcome.
>
>> The only problem I am having is that after a successful
>> bind and several passes through this code, it starts to misbehave.
>> The calls to syswrite return the value 1 instead of the number of
>> bytes
>> in the buffer as I might have expected.
>>
>> The problem is
>> - The call to syswrite() of a buffer of several hundred bytes
>> always returns 1
>>   and not the number of the several hundred bytes as expected.
>>   This causes the syswrite to be retried with a slightly smaller
>> buffer.
>>   The remote server appears to receive the original request, and
>> responds
>>   but subsequent writes of the smaller buffer confuse it and it
>> drops the connection.
>> - A system call trace of perl process reveals that it is calling
>> write()
>>   with several hundred bytes, and it is succeeding in writing all
>> of the bytes,
>>   NOT just 1 or a smaller number of bytes...
>
> Do you have the latest Net::SSLeay and IO::Socket::SSL installed ?
>
> When using SSL, the syswrite is effectively a call to
> Net::SSLeay::write_partial
>
>> I've tried judicious use of 'use bytes;' and a few other common
>> tricks.
>
> use bytes would not make a difference here.
>
>> If you'll look at the previous version, before this patch, you'll
>> see where
>> we only looked to see if syswrite returned zero or non-zero.  Not
>> the actual
>> number of bytes.
>
> Which was a bug as syswrite does not guarantee to send all the data
>
> Graham.
>
>> If I tweak my private copy of LDAP.pm to assume that
>> syswrite returned what I was expecting, it works as expected, and
>> the client
>> and server successfully communicate for as long as expected.
>>
>> I've seen this problem with Perl 5.8.8 on Solaris 9, 10, and 32Bit
>> i386 Redhat Fc5.
>> If you've seen this problem, or similar problems, or have a strong
>> clue
>> as to what might be wrong, I'd appreciate your comments.
>>
>> Comments welcome,
>>
>>
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.