On Tue, Jul 29, 2008 at 10:08:50AM +0000, Ed Avis wrote: > Abigail <abigail <at> abigail.be> writes: > > >>>I've always been a bit uncomfortable with the current magical behaviour, > >>>and that's why I tend to favor a non-compatible change. > > > - Programs that were written pre-5.12 that rely on while (<>) to be > > 2-arg open will silently fail to work correctly when run with a > > post 5.12 perl. > > Correct. I think they are a small number of programs relative to the > large number that 'rely' on while (<>) to just read some files - but > this just an educated guess, not something I can prove. > > However, the bug introduced will be a fairly benign one: 'file not > found' when trying to use a magic filename. Whereas the bug of > running an external command or overwriting a file given certain > filenames is a much more serious bug IMHO. Indeed, it will not be completely silent, it will issue a runtime warning. The program will still run, and even continue to run after the warning has been issued. > > - Programs that wouldn't use while (<>) pre-5.12 (because they might > > run in an environment where file names may start with '|' or '>') > > will use 3-arg "safe" while (<>), will be, silently, a security > > issue when run with a pre-5.12. > > Yes, I can see this is something to worry about. A conscientious > programmer could make a program that reads some files, but when > someone else runs it on an earlier perl version it becomes a risk. > > However, if you think this is bad (and not just 'theoretical') then > this implies believing that the status quo is also bad, since code > with while (<>) is silently a security issue right now - unless every > perl programmer currently using while (<>) has thought about the > implications and carefully decided to turn on the magic behaviour, > which seems unlikely. Not quite. If security is an issue, I think the safest way is to tell people *NOW*. Patch the documentation if you think it's not clear enough. Write articles on Perlmonks. Send errata to book publishers. Speak at a conference. Surely that would beat waiting for everyone to upgrade to 5.12. > The essential issue is to separate the operator for reading files from > the operator for doing magic. I propose that 5.12 have two > filehandles: > > SAFE_ARGV reads the files given > MAGIC_ARGV might read the files, or do other fun things > > Then there are three syntactic sugar pills: > > <> > <ARGV> > <<>> > > The choice to be made is either (A) maximum compatibility: > > <> means <MAGIC_ARGV> > <ARGV> means <MAGIC_ARGV> > <<>> means <SAFE_ARGV> > > or (B) safety by default: > > <> means <SAFE_ARGV> > <ARGV> means <SAFE_ARGV> > <<>> means <MAGIC_ARGV> > > >If you make "while (<<>>)" to be 3-arg open, then at least such programs > >will fail to compile when run with a pre-5.12 perl. > > Yes. Code using <SAFE_ARGV> explicitly would also fail to compile > with pre-5.12. No, it doesn't. Not even with strict. With warnings on, it's likely to issue a warning (unless SAFE_ARGV happens to be defined), but it's not a compile time error: $ perl -Mstrict -wE 'while (<SAFE_ARG>) {say} END {say "End"}' Name "main::SAFE_ARG" used only once: possible typo at -e line 1. readline() on unopened filehandle SAFE_ARG at -e line 1. End $ You'd be better off to make it a feature; using the feature will prevent the code from running on older perls. AbigailThread Previous | Thread Next