Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 May 2010 11:50:58 GMT
From:      Helmut Schneider <jumper99@gmx.de>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/146298: security/p5-Net-SSLeay not multi-treading aware
Message-ID:  <201005041150.o44BowmH096878@www.freebsd.org>
Resent-Message-ID: <201005041200.o44C0F91007627@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         146298
>Category:       ports
>Synopsis:       security/p5-Net-SSLeay not multi-treading aware
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue May 04 12:00:15 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Helmut Schneider
>Release:        8.0-RELEASE
>Organization:
>Environment:
>Description:
security/p5-Net-SSLeay cores when used in conjunction with multi-threaded perl:

[root@BSDHelmut ~]# perl /usr/local/bin/ldap-sync-objects.pl
Bus error: 10 (core dumped)
[root@BSDHelmut ~]# gdb perl ./perl5.10.1.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...(no debugging symbols found)...

warning: core file may not match specified executable file.
Core was generated by `perl5.10.1'.
Program terminated with signal 10, Bus error.
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
Reading symbols from /lib/libm.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libcrypt.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /lib/libutil.so.8...(no debugging symbols found)...done.
Loaded symbols for /lib/libutil.so.8
Reading symbols from /lib/libthr.so.3...(no debugging symbols found)...done.
Loaded symbols for /lib/libthr.so.3
Reading symbols from /lib/libc.so.7...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Encode/Encode.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Encode/Encode.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Time/HiRes/HiRes.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Time/HiRes/HiRes.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Cwd/Cwd.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Cwd/Cwd.so
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/Fcntl/Fcntl.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/Fcntl/Fcntl.so
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/IO/IO.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/IO/IO.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/List/Util/Util.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/List/Util/Util.so
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/Sys/Hostname/Hostname.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/Sys/Hostname/Hostname.so
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/Data/Dumper/Dumper.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/Data/Dumper/Dumper.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Devel/Size/Size.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Devel/Size/Size.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/MIME/Base64/Base64.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/MIME/Base64/Base64.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Compress/Raw/Zlib/Zlib.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Compress/Raw/Zlib/Zlib.so
Reading symbols from /lib/libz.so.5...(no debugging symbols found)...done.
Loaded symbols for /lib/libz.so.5
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/Socket/Socket.so...(no debugging symbols found)...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/Socket/Socket.so
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Net/SSLeay/SSLeay.so...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Net/SSLeay/SSLeay.so
Reading symbols from /usr/lib/libssl.so.6...done.
Loaded symbols for /usr/lib/libssl.so.6
Reading symbols from /lib/libcrypto.so.6...done.
Loaded symbols for /lib/libcrypto.so.6
Reading symbols from /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Socket6/Socket6.so...done.
Loaded symbols for /usr/local/lib/perl5/site_perl/5.10.1/mach/auto/Socket6/Socket6.so
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/threads/threads.so...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/threads/threads.so
Reading symbols from /usr/local/lib/perl5/5.10.1/mach/auto/threads/shared/shared.so...done.
Loaded symbols for /usr/local/lib/perl5/5.10.1/mach/auto/threads/shared/shared.so
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x0000000800d7f3c7 in free () from /lib/libc.so.7
[New Thread 8010021c0 (LWP 100143)]
(gdb) bt
#0  0x0000000800d7f3c7 in free () from /lib/libc.so.7
#1  0x00000008031cb45d in CRYPTO_free () from /lib/libcrypto.so.6
#2  0x0000000803177857 in sk_free () from /lib/libcrypto.so.6
#3  0x0000000802f848e8 in SSL_free () from /usr/lib/libssl.so.6
#4  0x0000000802e4156a in XS_Net__SSLeay_free (my_perl=Variable "my_perl" is not available.
) at SSLeay.c:1189
#5  0x00000008006eb610 in Perl_pp_entersub () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#6  0x00000008006e9b8e in Perl_runops_standard () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#7  0x0000000800691191 in Perl_call_sv () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#8  0x00000008006fd83f in Perl_sv_clear () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#9  0x00000008006fe032 in Perl_sv_free2 () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#10 0x00000008006f3199 in S_visit () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#11 0x00000008006f31f1 in Perl_sv_clean_objs () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#12 0x00000008006956c9 in perl_destruct () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#13 0x0000000803905cfc in S_ithread_clear () from /usr/local/lib/perl5/5.10.1/mach/auto/threads/threads.so
#14 0x00000008039066ec in XS_threads_join () from /usr/local/lib/perl5/5.10.1/mach/auto/threads/threads.so
#15 0x00000008006eb610 in Perl_pp_entersub () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#16 0x00000008006e9b8e in Perl_runops_standard () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#17 0x0000000800691bee in perl_run () from /usr/local/lib/perl5/5.10.1/mach/CORE/libperl.so
#18 0x0000000000400c8c in main ()
(gdb)

The problem also exists in perl 5.8.x

>How-To-Repeat:
An example perl script is attached, it connects to an LDAP repository (Active Directory) multi-threaded. If the script is either run single-threaded or without using ssl it runs fine.
>Fix:


Patch attached with submission follows:

#!/usr/bin/perl

use strict;
use warnings;
use Encode;

chmod 0700, $0;

### Load Modules ### 
use threads;
use threads::shared;
use IO::Socket::SSL qw(INET4);
use Net::LDAP;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant qw( LDAP_CONTROL_PAGED );
use Net::LDAPS;

my $srcDC = "ldapserver.domain.tld";
my $srcDomain = "domain.tld";
my $port = "636";
my $searchBase = "OU=User,DC=DOMAIN,DC=TLD";
my $ldapBindUser = "user\@$srcDomain";
my $ldapBindPass = "password";

my $filter = "(objectClass=user)";
my $attribute = "mail";
my ($conn, $result, $objectsDN, $cookie);
my $srcThread;

sub queryLdapDNs ($$$$) {
	my $_conn = shift;
	my $_searchBase = shift;
	my $_filter = shift;
	my $_attribute = shift;

	my ($_object, $_memberDN, $_result, $_objectsDN, $cookie);

	# Required to query more than 1000 Entries
	my $_page = Net::LDAP::Control::Paged->new( size => 1000 );
	while (1) {
		$_result = $_conn->search(base=>$_searchBase,filter=>$_filter,scope=>'sub',control=>[ $_page ]);
			die $_result->error() if $_result->code();
		foreach $_object ($_result->entries) {
			# Read Array 'members'
			foreach my $_objectDN ($_object->get_value($_attribute)) {
			       push(@$_objectsDN, decode('utf8', $_objectDN));
			}
		}
		my ($resp) = $_result->control(LDAP_CONTROL_PAGED) or last;
		$cookie = $resp->cookie or last;
		$_page->cookie($cookie);
	}
	if ($cookie) {
		$_page->cookie($cookie);
		$_page->size(0);
		$_result->search(base=>$_searchBase,filter=>$_filter,scope=>'sub',control=>[ $_page ]);
	}
	return $_objectsDN;
}

$conn = Net::LDAPS->new($srcDC, port=>$port) or die "$@";
$conn->bind($ldapBindUser, password=>$ldapBindPass) or die "$@";
### Change comments of the next 3 lines to run single-threaded
#$objectsDN = queryLdapDNs($conn, $searchBase, $filter, $attribute);
$srcThread = threads->create(\&queryLdapDNs, $conn, $searchBase, $filter, $attribute);
$objectsDN = $srcThread->join();

print "Attributes queried: " . @$objectsDN . "\n";


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005041150.o44BowmH096878>