]> git.proxmox.com Git - qemu-server.git/commitdiff
avoid harmful '<>' pattern, explicitly read from STDIN
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 22 Jan 2018 09:52:11 +0000 (10:52 +0100)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Mon, 22 Jan 2018 13:56:27 +0000 (14:56 +0100)
Fixes problems in CLIHandler using the code pattern:

while (my $line = <>) {
    ...
}

For why this causes only _now_ problems lets first look how <>
behaves:

"The null filehandle <> is special: [...] Input from <> comes either
from standard input, or from each file listed on the command line.
Here's how it works: the first time <> is evaluated, the @ARGV array
is checked, and if it is empty, $ARGV[0] is set to "-" , which when
opened gives you standard input.  The @ARGV array is then processed
as a list of filenames." - 'perldoc perlop'

Recent changes in the CLIHandler code changed how we modfiied @ARGV
Earlier we assumed that the first argument must be the command and
thus shifted it out of @ARGV, now we can have multiple levels of
(sub)commands. This change also changed how we handle @ARGV, we do
not unshift anything but go through the arguments until we got to
the final command and copy the rest of @ARGV as we know that this
must be the commandos arguments.

For '<>' this means that ARGV was still fully populated and perl
tried to open element as a file, which naturally failed.
Thus the change in pve-common only exposed this 'dangerous' code
pattern.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
PVE/API2/Qemu.pm
PVE/CLI/qm.pm

index 0983ce6977e0ac91d284429e25fe9c1e43ff767c..b277a2681989344f83b5df6fb360d1c395b7ad82 100644 (file)
@@ -1849,7 +1849,7 @@ __PACKAGE__->register_method({
        # read spice ticket from STDIN
        my $spice_ticket;
        if ($stateuri && ($stateuri eq 'tcp') && $migratedfrom && ($rpcenv->{type} eq 'cli')) {
-           if (defined(my $line = <>)) {
+           if (defined(my $line = <STDIN>)) {
                chomp $line;
                $spice_ticket = $line;
            }
index 564e443951bf9c5356ed4cf37195e6464036e039..04beb48ef943525653dc177ad53df8c0b4efb38c 100755 (executable)
@@ -286,7 +286,7 @@ __PACKAGE__->register_method ({
        $tunnel_write->("tunnel online");
        $tunnel_write->("ver 1");
 
-       while (my $line = <>) {
+       while (my $line = <STDIN>) {
            chomp $line;
            if ($line =~ /^quit$/) {
                $tunnel_write->("OK");