Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attribute::Handlers relies dangerously on $_ when calling external code #10280

Closed
p5pRT opened this issue Apr 4, 2010 · 4 comments
Closed

Attribute::Handlers relies dangerously on $_ when calling external code #10280

p5pRT opened this issue Apr 4, 2010 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Apr 4, 2010

Migrated from rt.perl.org#74052 (status was 'resolved')

Searchable as RT74052$

@p5pRT
Copy link
Author

p5pRT commented Apr 4, 2010

From lanx.perl@googlemail.com

Created by lanx.perl@googlemail.com

The module Attribute​::Handlers relies on that $_ will not be changed when
calling external handlers.

This is due to the fact that _apply_handler_AH_() is called with $_ as loop
variable in a postfix foreach.

Here are the corresponding lines in v0.87

240​: _apply_handler_AH_($_,'CHECK') foreach @​declarations;
245​: _apply_handler_AH_($_,'INIT') foreach @​declarations
249​:END { $global_phase++; _apply_handler_AH_($_,'END') foreach
@​declarations }

This causes unnecessary traps for users, please refer to
http​://perlmonks.org/?node_id=832612 for an example.

Generally changing these *PHASE*-loops to

for my $declaration (@​declarations) {
  _apply_handler_AH_($declaration, *PHASE* );
}

should easily solve this issue.

here a working diff

diff Handlers.pm Attribute/Handlers.pm
--------------------------------------------
240c240,242
< _apply_handler_AH_($_,'CHECK') foreach @​declarations;
---

           foreach my $decl \(@&#8203;declarations\) \{
     \_apply\_handler\_AH\_\($decl\,'CHECK'\);
       \}

245c247,249
< _apply_handler_AH_($_,'INIT') foreach @​declarations
---

            foreach my $decl \(@&#8203;declarations\) \{
      \_apply\_handler\_AH\_\($decl\,'INIT'\);
    \}

249c253,258
< END { $global_phase++; _apply_handler_AH_($_,'END') foreach @​declarations
}
---

END {
$global_phase++;
foreach my $decl (@​declarations) {
_apply_handler_AH_($decl,'END');
}
}
---------------------------------

Perl Info

Flags:
    category=library
    severity=medium

Site configuration information for perl 5.10.0:

Configured by Debian Project at Fri Jun 26 19:28:31 UTC 2009.

Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=linux, osvers=2.6.24-23-server,
archname=i486-linux-gnu-thread-multi
    uname='linux rothera 2.6.24-23-server #1 smp wed apr 1 22:22:14 utc 2009
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.0
-Dsitearch=/usr/local/lib/perl/5.10.0 -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.0
-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 -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
-I/usr/local/include'
    ccversion='', gccversion='4.3.2', 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 =' -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.8.90.so, so=so, useshrplib=true,
libperl=libperl.so.5.10.0
    gnulibc_version='2.8.90'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib'

Locally applied patches:



@INC for perl 5.10.0:
    /etc/perl
    /usr/local/lib/perl/5.10.0
    /usr/local/share/perl/5.10.0
    /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.0:
    HOME=/home/lanx
    LANG=de_DE.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)

PATH=/home/lanx/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/lanx/bin:.
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Apr 5, 2010

@tsee - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Apr 5, 2010

From @tsee

I applied the patch locally and will make a new CPAN release today. The
change will not be in perl 5.12. I will synchronize after 5.12.0 or
5.12.1 are out, depending on Jesse's ruling whether this should be in .1.

--Steffen

@p5pRT
Copy link
Author

p5pRT commented Apr 5, 2010

@tsee - Status changed from 'open' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant