in reply to Re: hard-to-understand taint error
in thread hard-to-understand taint error

I cooked up a regexp for "how the filenames to be deleted should look" and now the taint checking is happy:
my @dels = (); opendir DIR, DB_DIREC or die "can't open direc ".DB_DIREC.": $!"; for (readdir DIR) { if (/^(__[-!#.0-9@-Z_a-z]+)$/) {push @dels, DB_DIREC."/$1"} } closedir DIR; if (@dels) {unlink @dels}
Thanks for your help,
cmac
www.animalhead.com

Replies are listed 'Best First'.
Re^3: hard-to-understand taint error
by ww (Archbishop) on Feb 18, 2009 at 13:23 UTC

    That regex won't capture files with UC letters

    #!/usr/bin/perl use warnings; use strict; # 744661 my @var = [ 'foo.Bar', 'for.bar', ]; for my $var(@var) { if ( $var =~ /^(__[-!#.0-9@-Z_a-z]+)$/ ) { print "\$var: $var\n"; } else { print "no match!\n"; } }

    If you're concerned about files like "foo.Bar", use the /i modifier.

      Not true. [@-Z] is an obfuscated way of writing [\@A-Z]. Your test fails for two reasons:
      • Your array only contains one element and it's an array reference.
      • Your file names don't start with __.
        Aaaargh!

        How do I downvote / borg myself?

        However (conveniently bypassing the requirement for names beginning with __):

        #!/usr/bin/perl use warnings; use strict; # 744661 my @var = ( 'foo.Bar', 'for.bar', ); for my $var(@var) { print "Before regex, \$var: $var \n"; if ( $var =~ /^([-!#.0-9@-Z_a-z]+)$/ ) { print "\$var: $var\n"; } else { print "no match!\n"; } }

        produces:

        Before regex, $var: foo.Bar no match! Before regex, $var: for.bar $var: for.bar

        whereas using /i in the regex at line 12:

        Before regex, $var: foo.Bar $var: foo.Bar Before regex, $var: for.bar $var: for.bar

        leaving me to wonder about the "shorthand."

Re^3: hard-to-understand taint error
by lostjimmy (Chaplain) on Feb 18, 2009 at 14:31 UTC

    It looks like your original requirement was files starting with '__'.

    Similar to what ww is saying, you can simplify your capture to /^(__.*)$/; then you won't have to worry about upper-case matching.

      But since we already grepped for /^__/, that can be simplified /^(.*)$/. Looks scary, but it's fine here. Either we trust DB_DIREC or we don't (in which case, it could be used to delete /etc/__important even with the "safer" untainting).