From nobody Mon Feb 9 09:16:01 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1713532161069310.4889644542425; Fri, 19 Apr 2024 06:09:21 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 02FD91D70; Fri, 19 Apr 2024 09:09:19 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 968871DD1; Fri, 19 Apr 2024 09:05:49 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 479EC1D76; Fri, 19 Apr 2024 09:05:43 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id DF88E1C75 for ; Fri, 19 Apr 2024 09:05:38 -0400 (EDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-606-T-ad9vHvONuGlF0RgWae0Q-1; Fri, 19 Apr 2024 09:05:36 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8F264800CA2 for ; Fri, 19 Apr 2024 13:05:36 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.11]) by smtp.corp.redhat.com (Postfix) with ESMTP id 041DB2166B34 for ; Fri, 19 Apr 2024 13:05:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: T-ad9vHvONuGlF0RgWae0Q-1 From: Peter Krempa To: devel@lists.libvirt.org Subject: [PATCH 03/13] vsh: Fix 'stdin' closing in 'cmdComplete' Date: Fri, 19 Apr 2024 15:05:21 +0200 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.6 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: IZQWZABK6NAAU2EYCFW2IBK3MA6UHOHS X-Message-ID-Hash: IZQWZABK6NAAU2EYCFW2IBK3MA6UHOHS X-MailFrom: pkrempa@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1713532162827100001 While the 'complete' command is meant to be hidden and used only for the completion script, there's nothing preventing it being used in all virsh modes. This poses a problem as the command tries to close 'stdin' to avoid the possibility that an auth callback would want to read the password. In interactive mode this immediately terminates virsh and in non-interactive mode it attempts to close it multiple times if you use virsh in batch mode. Fix the issues by using virOnce() to close it exactly once and do so only in non-interactive mode. Signed-off-by: Peter Krempa --- tools/vsh.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/vsh.c b/tools/vsh.c index d6c05c46e6..8719875413 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -3401,11 +3401,25 @@ const vshCmdInfo info_complete =3D { #ifdef WITH_READLINE + +static virOnceControl vshCmdCompleteCloseStdinOnce =3D VIR_ONCE_CONTROL_IN= ITIALIZER; + +static void +vshCmdCompleteCloseStdin(void) +{ + /* In non-interactive mode which is how the 'complete' command is inte= nded + * to be used we need to ensure that any authentication callback will = not + * attempt to read any input which would break the completion */ + int stdin_fileno =3D STDIN_FILENO; + + VIR_FORCE_CLOSE(stdin_fileno); +} + + bool cmdComplete(vshControl *ctl, const vshCmd *cmd) { const vshClientHooks *hooks =3D ctl->hooks; - int stdin_fileno =3D STDIN_FILENO; const char *arg =3D ""; const vshCmdOpt *opt =3D NULL; g_auto(GStrv) matches =3D NULL; @@ -3418,7 +3432,10 @@ cmdComplete(vshControl *ctl, const vshCmd *cmd) /* This command is flagged VSH_CMD_FLAG_NOCONNECT because we * need to prevent auth hooks reading any input. Therefore, we * have to close stdin and then connect ourselves. */ - VIR_FORCE_CLOSE(stdin_fileno); + if (!ctl->imode) { + if (virOnce(&vshCmdCompleteCloseStdinOnce, vshCmdCompleteCloseStdi= n) < 0) + return false; + } if (!(hooks && hooks->connHandler && hooks->connHandler(ctl))) return false; --=20 2.44.0 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org