]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Use open2 instead of open for s_server instance
authorFrederik Wedel-Heinen <frederik.wedel-heinen@dencrypt.dk>
Mon, 22 Jan 2024 13:12:06 +0000 (14:12 +0100)
committerMatt Caswell <matt@openssl.org>
Fri, 9 Feb 2024 08:11:23 +0000 (08:11 +0000)
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Matt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/23319)

util/perl/TLSProxy/Proxy.pm

index 0084328a5f17a6b338e7cd70833688a5e2d7beec..08c82c0c52d06ead568f4a5a430a0576875309d9 100644 (file)
@@ -7,6 +7,7 @@
 
 use strict;
 use POSIX ":sys_wait_h";
+use IPC::Open2;
 
 package TLSProxy::Proxy;
 
@@ -203,7 +204,7 @@ sub connect_to_server
                              Proto => $self->{isdtls} ? 'udp' : 'tcp');
     if (!defined($sock)) {
         my $err = $!;
-        kill(3, $self->{real_serverpid});
+        kill(3, $self->{serverpid});
         die "unable to connect: $err\n";
     }
 
@@ -215,7 +216,6 @@ sub start
     my ($self) = shift;
     my $pid;
 
-
     # Create the Proxy socket
     my $proxaddr = $self->{proxy_addr};
     $proxaddr =~ s/[\[\]]//g; # Remove [ and ]
@@ -290,17 +290,13 @@ sub start
         print STDERR "Server command: $execcmd\n";
     }
 
-    open(my $savedin, "<&STDIN");
-
-    # Temporarily replace STDIN so that sink process can inherit it...
-    $pid = open(STDIN, "$execcmd 2>&1 |") or die "Failed to $execcmd: $!\n";
-    $self->{real_serverpid} = $pid;
+    $pid = IPC::Open2::open2(my $sout, my $sin, $execcmd) or die "Failed to $execcmd: $!\n";
+    $self->{serverpid} = $pid;
 
     # Process the output from s_server until we find the ACCEPT line, which
     # tells us what the accepting address and port are.
-    while (<>) {
-        print;
-        s/\R$//;                # Better chomp
+    while (<$sout>) {
+        chomp;
         next unless (/^ACCEPT\s.*:(\d+)$/);
         $self->{server_port} = $1;
         last;
@@ -313,38 +309,6 @@ sub start
         die "no ACCEPT detected in '$execcmd' output: $?\n";
     }
 
-    # Just make sure everything else is simply printed [as separate lines].
-    # The sub process simply inherits our STD* and will keep consuming
-    # server's output and printing it as long as there is anything there,
-    # out of our way.
-    my $error;
-    $pid = undef;
-    if (eval { require Win32::Process; 1; }) {
-        if (Win32::Process::Create(my $h, $^X, "perl -ne print", 0, 0, ".")) {
-            $pid = $h->GetProcessID();
-            $self->{proc_handle} = $h;  # hold handle till next round [or exit]
-        } else {
-            $error = Win32::FormatMessage(Win32::GetLastError());
-        }
-    } else {
-        if (defined($pid = fork)) {
-            $pid or exec("$^X -ne print") or exit($!);
-        } else {
-            $error = $!;
-        }
-    }
-
-    # Change back to original stdin
-    open(STDIN, "<&", $savedin);
-    close($savedin);
-
-    if (!defined($pid)) {
-        kill(3, $self->{real_serverpid});
-        die "Failed to capture s_server's output: $error\n";
-    }
-
-    $self->{serverpid} = $pid;
-
     print STDERR "Server responds on ",
                  "$self->{server_addr}:$self->{server_port}\n";
 
@@ -401,7 +365,7 @@ sub clientstart
         # dead-lock...
         if (!($pid = open(STDOUT, "| $execcmd"))) {
             my $err = $!;
-            kill(3, $self->{real_serverpid});
+            kill(3, $self->{serverpid});
             die "Failed to $execcmd: $err\n";
         }
         $self->{clientpid} = $pid;
@@ -417,7 +381,7 @@ sub clientstart
     # Wait for incoming connection from client
     my $fdset = IO::Select->new($self->{proxy_sock});
     if (!$fdset->can_read(60)) {
-        kill(3, $self->{real_serverpid});
+        kill(3, $self->{serverpid});
         die "s_client didn't try to connect\n";
     }
 
@@ -476,14 +440,14 @@ sub clientstart
                     $server_sock->shutdown(SHUT_WR);
                 }
             } else {
-                kill(3, $self->{real_serverpid});
+                kill(3, $self->{serverpid});
                 die "Unexpected handle";
             }
         }
     }
 
     if ($ctr >= 10) {
-        kill(3, $self->{real_serverpid});
+        kill(3, $self->{serverpid});
         print "No progress made\n";
         $succes = 0;
     }
@@ -502,15 +466,6 @@ sub clientstart
     my $pid;
     if (--$self->{serverconnects} == 0) {
         $pid = $self->{serverpid};
-        print "Waiting for 'perl -ne print' process to close: $pid...\n";
-        $pid = waitpid($pid, 0);
-        if ($pid > 0) {
-            die "exit code $? from 'perl -ne print' process\n" if $? != 0;
-        } elsif ($pid == 0) {
-            kill(3, $self->{real_serverpid});
-            die "lost control over $self->{serverpid}?";
-        }
-        $pid = $self->{real_serverpid};
         print "Waiting for s_server process to close: $pid...\n";
         # it's done already, just collect the exit code [and reap]...
         waitpid($pid, 0);