[perl #75792] Unexpected nested closure circular reference (possibly a Scalar::Util::weaken issue?)

[email protected] (Peter Rabbitson)
Newsgroups perl.perl5.porters
Message-ID <[email protected]>
# New Ticket Created by  Peter Rabbitson 
# Please include the string:  [perl #75792]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=75792 >


This is a bug report for perl from [email protected],
generated with the help of perlbug 1.39 running under perl 5.10.1.


-----------------------------------------------------------------
[Please describe your issue here]

During the construction of the following:

A hashref H containing a reference to a coderef C which is a closure
iver a *weakened* reference WH of the original hashref H

A leak is introduced IFF the code inserting C into H is implemented
as a coderef (as opposed to a block).

To illustrate:

This does not leak
=======================================
sub scoped_factory {
   my $self = {};

   {
     my $weakself = $self;
     weaken $weakself;
     $self->{coderef} = sub { die $weakself if $weakself };
   }

   $self;
}


This leaks $self (and everything below)
========================================
sub closure_factory {
   my $self = {};

   sub {
     my $weakself = $self;
     weaken $weakself;
     $self->{coderef} = sub { die $weakself if $weakself };
   }->();

   $self;
}


The issue has been reproduced on all versions of perl from 5.8 on,
including bleadperl. It was originally discovered when an eval {}
was switched to try{} from Try::Tiny in a piece of code installing
DESTROY guards

Attached a test with various invocations of the "constructor"

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
     category=core
     severity=medium
---
Site configuration information for perl 5.10.1:

Configured by Debian Project at Sun May 30 22:40:05 UTC 2010.

Summary of my perl5 (revision 5 version 10 subversion 1) configuration:

   Platform:
     osname=linux, osvers=2.6.32.14-dsa-ia32, archname=i486-linux-gnu-thread-multi
     uname='linux murphy 2.6.32.14-dsa-ia32 #1 smp thu may 27 16:19:20 cest 2010 i686 gnulinux '
     config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 
-Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des'
     hint=recommended, useposix=true, d_sigaction=define
     useithreads=define, usemultiplicity=define
     useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
     use64bitint=undef, use64bitall=undef, uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
     optimize='-O2 -g',
     cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
     ccversion='', gccversion='4.4.4', gccosandvers=''
     intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
     ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
     alignbytes=4, prototype=define
   Linker and Libraries:
     ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
     libpth=/usr/local/lib /lib /usr/lib /usr/lib64
     libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
     perllibs=-ldl -lm -lpthread -lc -lcrypt
     libc=/lib/libc-2.11.1.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1
     gnulibc_version='2.11.1'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
     cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'

Locally applied patches:
     DEBPKG:debian/arm_thread_stress_timeout - http://bugs.debian.org/501970 Raise the timeout of ext/threads/shared/t/stress.t to accommodate slower build hosts
     DEBPKG:debian/cpan_config_path - Set location of CPAN::Config to /etc/perl as /usr may not be writable.
     DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules installed from CPAN.
     DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove overly restrictive DB_File version check.
     DEBPKG:debian/doc_info - Replace generic man(1) instructions with Debian-specific information.
     DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak enc2xs to follow symlinks and ignore missing @INC directories.
     DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove Errno version check due to upgrade problems with long-running processes.
     DEBPKG:debian/extutils_hacks - Various debian-specific ExtUtils changes
     DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary targets.
     DEBPKG:debian/instmodsh_doc - Debian policy doesn't install .packlist files for core or vendor.
     DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per Debian policy.
     DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to /etc/perl/Net as /usr may not be writable.
     DEBPKG:debian/m68k_thread_stress - http://bugs.debian.org/495826 Disable some threads tests on m68k for now due to missing TLS.
     DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
     DEBPKG:debian/module_build_man_extensions - http://bugs.debian.org/479460 Adjust Module::Build manual page extensions for the Debian Perl policy
     DEBPKG:debian/perl_synopsis - http://bugs.debian.org/278323 Rearrange perl.pod
     DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the list of libraries wanted to what we actually need.
     DEBPKG:debian/use_gdbm - Explicitly link against -lgdbm_compat in ODBM_File/NDBM_File.
     DEBPKG:fixes/assorted_docs - http://bugs.debian.org/443733 [384f06a] Math::BigInt::CalcEmu documentation grammar fix
     DEBPKG:fixes/net_smtp_docs - http://bugs.debian.org/100195 [rt.cpan.org #36038] Document the Net::SMTP 'Port' option
     DEBPKG:fixes/processPL - http://bugs.debian.org/357264 [rt.cpan.org #17224] Always use PERLRUNINST when building perl modules.
     DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp skip include directories in /usr/local
     DEBPKG:fixes/pod2man-index-backslash - http://bugs.debian.org/521256 Escape backslashes in .IX entries
     DEBPKG:debian/disable-zlib-bundling - Disable zlib bundling in Compress::Raw::Zlib
     DEBPKG:fixes/kfreebsd_cppsymbols - http://bugs.debian.org/533098 [3b910a0] Add gcc predefined macros to $Config{cppsymbols} on GNU/kFreeBSD.
     DEBPKG:debian/cpanplus_definstalldirs - http://bugs.debian.org/533707 Configure CPANPLUS to use the site directories by default.
     DEBPKG:debian/cpanplus_config_path - Save local versions of CPANPLUS::Config::System into /etc/perl.
     DEBPKG:fixes/kfreebsd-filecopy-pipes - http://bugs.debian.org/537555 [16f708c] Fix File::Copy::copy with pipes on GNU/kFreeBSD
     DEBPKG:fixes/anon-tmpfile-dir - http://bugs.debian.org/528544 [perl #66452] Honor TMPDIR when open()ing an anonymous temporary file
     DEBPKG:fixes/abstract-sockets - http://bugs.debian.org/329291 [89904c0] Add support for Abstract namespace sockets.
     DEBPKG:fixes/hurd_cppsymbols - http://bugs.debian.org/544307 [eeb92b7] Add gcc predefined macros to $Config{cppsymbols} on GNU/Hurd.
     DEBPKG:fixes/autodie-flock - http://bugs.debian.org/543731 Allow for flock returning EAGAIN instead of EWOULDBLOCK on linux/parisc
     DEBPKG:fixes/archive-tar-instance-error - http://bugs.debian.org/539355 [rt.cpan.org #48879] Separate Archive::Tar instance error strings from each other
     DEBPKG:fixes/positive-gpos - http://bugs.debian.org/545234 [perl #69056] [c584a96] Fix \\G crash on first match
     DEBPKG:debian/devel-ppport-ia64-optim - http://bugs.debian.org/548943 Work around an ICE on ia64
     DEBPKG:fixes/trie-logic-match - http://bugs.debian.org/552291 [perl #69973] [0abd0d7] Fix a DoS in Unicode processing [CVE-2009-3626]
     DEBPKG:fixes/hppa-thread-eagain - http://bugs.debian.org/554218 make the threads-shared test suite more robust, fixing failures on hppa
     DEBPKG:fixes/crash-on-undefined-destroy - http://bugs.debian.org/564074 [perl #71952] [1f15e67] Fix a NULL pointer dereference when looking for a DESTROY method
     DEBPKG:fixes/tainted-errno - http://bugs.debian.org/574129 [perl #61976] [be1cf43] fix an errno stringification bug in taint mode
     DEBPKG:fixes/safe-upgrade - http://bugs.debian.org/582978 Upgrade Safe.pm to 2.25, fixing CVE-2010-1974
     DEBPKG:fixes/tell-crash - http://bugs.debian.org/578577 [f4817f3] Fix a tell() crash on bad arguments.
     DEBPKG:fixes/format-write-crash - http://bugs.debian.org/579537 [perl #22977] [421f30e] Fix a crash in format/write
     DEBPKG:fixes/arm-alignment - http://bugs.debian.org/289884 Prevent gcc from optimizing the alignment test away on armel
     DEBPKG:fixes/fcgi-test - Fix a failure in CGI/t/fast.t when FCGI is installed
     DEBPKG:patchlevel - http://bugs.debian.org/567489 List packaged patches for 5.10.1-13 in patchlevel.h

---
@INC for perl 5.10.1:
     /home/rabbit/devel/utils/perl
     /home/rabbit/LOCAL_PERL5/lib/perl5/i486-linux-gnu-thread-multi
     /home/rabbit/LOCAL_PERL5/lib/perl5
     /home/rabbit/LOCAL_PERL5/lib/perl5/i486-linux-gnu-thread-multi
     /etc/perl
     /usr/local/lib/perl/5.10.1
     /usr/local/share/perl/5.10.1
     /usr/lib/perl5
     /usr/share/perl5
     /usr/lib/perl/5.10
     /usr/share/perl/5.10
     /usr/local/lib/site_perl
     .

---
Environment for perl 5.10.1:
     HOME=/home/rabbit
     LANG=en_US.UTF-8
     LANGUAGE (unset)
     LC_ADDRESS=en_US.UTF-8
     LC_COLLATE=en_US.UTF-8
     LC_CTYPE=en_US.UTF-8
     LC_IDENTIFICATION=en_US.UTF-8
     LC_MESSAGES=en_US.UTF-8
     LC_MONETARY=en_US.UTF-8
     LC_NAME=en_US.UTF-8
     LC_NUMERIC=en_US.UTF-8
     LC_TELEPHONE=en_US.UTF-8
     LC_TIME=en_US.UTF-8
     LD_LIBRARY_PATH (unset)
     LOGDIR (unset)
     PATH=/home/rabbit/devel/utils:/home/rabbit/perl5/perlbrew/bin:/home/rabbit/perl5/perlbrew/perls/current/bin:/home/rabbit/LOCAL_PERL5/bin:/home/rabbit/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
     PERL5LIB=/home/rabbit/devel/utils/perl:/home/rabbit/LOCAL_PERL5/lib/perl5:/home/rabbit/LOCAL_PERL5/lib/perl5/i486-linux-gnu-thread-multi:
     PERL_AUTOINSTALL_PREFER_CPAN=1
     PERL_BADLANG (unset)
     PERL_MM_OPT=INSTALL_BASE=/home/rabbit/LOCAL_PERL5
     SHELL=/bin/bash
leak.t (application/x-troff, 1.7 KB) - not displayed
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.