]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: never close stdin
authortobias@openbsd.org <tobias@openbsd.org>
Tue, 30 Apr 2024 15:40:43 +0000 (15:40 +0000)
committerDamien Miller <djm@mindrot.org>
Wed, 8 May 2024 04:57:47 +0000 (14:57 +1000)
The sanitise_stdfd call makes sure that standard file descriptors are
open (if they were closed, they are connected with /dev/null).

Do not close stdin in any case to prevent error messages when stdin is
read multiple times and to prevent later usage of fd 0 for connections,
e.g.

echo localhost | ssh-keyscan -f - -f -

While at it, make stdin-related error messages nicer.

Authored with Max Kunzelmann <maxdev at posteo dot de>

ok djm

OpenBSD-Commit-ID: 48e9b7938e2fa2f9bd47e6de6df66a31e0b375d3

ssh-keyscan.c

index f2e6b59e38fdc53f4b362ca7c62740d0b63c0972..ac6551ea4c847b0770261f254daad7c129aa3bdb 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-keyscan.c,v 1.155 2024/01/11 01:45:36 djm Exp $ */
+/* $OpenBSD: ssh-keyscan.c,v 1.156 2024/04/30 15:40:43 tobias Exp $ */
 /*
  * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>.
  *
@@ -854,7 +854,8 @@ main(int argc, char **argv)
                if (argv[j] == NULL)
                        fp = stdin;
                else if ((fp = fopen(argv[j], "r")) == NULL)
-                       fatal("%s: %s: %s", __progname, argv[j], strerror(errno));
+                       fatal("%s: %s: %s", __progname,
+                           fp == stdin ? "<stdin>" : argv[j], strerror(errno));
 
                while (getline(&line, &linesize, fp) != -1) {
                        /* Chomp off trailing whitespace and comments */
@@ -876,9 +877,11 @@ main(int argc, char **argv)
                }
 
                if (ferror(fp))
-                       fatal("%s: %s: %s", __progname, argv[j], strerror(errno));
+                       fatal("%s: %s: %s", __progname,
+                           fp == stdin ? "<stdin>" : argv[j], strerror(errno));
 
-               fclose(fp);
+               if (fp != stdin)
+                       fclose(fp);
        }
        free(line);