Web lists-archives.com

Re: Potentially insecure Perl scripts




On 1/23/19 6:23 PM, Colin Watson wrote:
> On Wed, Jan 23, 2019 at 06:09:39PM +0100, Alex Mestiashvili wrote:
>> On 1/23/19 5:31 PM, Colin Watson wrote:
>>> On Wed, Jan 23, 2019 at 05:23:10PM +0100, Alex Mestiashvili wrote:
>>>> On 1/23/19 4:44 PM, Vincent Lefevre wrote:
>>>>> I agree that it would be better to drop this "feature" of Perl.
>>>>> It is probably never used, and probably useless (I would rather
>>>>> use the features from the shell if I need a pipe).
>>>>
>>>> Perl's open is well documented. Quoting the perlipc:
>>>>
>>>> "it's much more efficient to process the file one line or record at a
>>>> time because then you don't have to read the whole thing into memory at
>>>> once."
>>>
>>> This is a red herring.  Prepending a pipe to a perl command doesn't
>>> require reading the whole thing into memory.
>>
>> Well, this is not never used and is not useless. I just provided a quote
>> pointing to a use case. Deciding if that is useful or not is up to you.
> 
> Ah, I see.  I think it would have been clearer what you meant with a bit
> more context, so here it is for others:
> 
>        If one can be sure that a particular program is a Perl script
>        expecting filenames in @ARGV, the clever programmer can write
>        something like this:
> 
>            % program f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile
> 
>        and no matter which sort of shell it's called from, the Perl
>        program will read from the file f1, the process cmd1, standard
>        input (tmpfile in this case), the f2 file, the cmd2 command,
>        and finally the f3 file.  Pretty nifty, eh?
> 
>        You might notice that you could use backticks for much the same
>        effect as opening a pipe for reading:
> 
>            print grep { !/^(tcp|udp)/ } `netstat -an 2>&1`;
>            die "bad netstatus ($?)" if $?;
> 
>        While this is true on the surface, it's much more efficient to
>        process the file one line or record at a time because then you
>        don't have to read the whole thing into memory at once.  It
>        also gives you finer control of the whole process, letting you
>        kill off the child process early if you'd like.
> 
> (In this case, my argument is with the documentation not pointing out in
> this particular spot what the problems are with this approach.)
> 

Indeed, my answer was kind of misleading without looking into the man page.

Thanks for correcting.