From patchwork Tue Jul 8 22:51:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Drake X-Patchwork-Id: 115892 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 7131C3857350 for ; Tue, 8 Jul 2025 22:52:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7131C3857350 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=jdrake.com header.i=@jdrake.com header.a=rsa-sha1 header.s=csoft header.b=c4iwlniD X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from mail231.csoft.net (mail231.csoft.net [66.216.5.135]) by sourceware.org (Postfix) with ESMTPS id 1F3A73857820 for ; Tue, 8 Jul 2025 22:51:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1F3A73857820 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=jdrake.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=jdrake.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1F3A73857820 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=66.216.5.135 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1752015082; cv=none; b=xxsZcST9wPP632lJ2tsWpOVvyL2YIl0QH2jonI6qjnZU59ZDCJ169mqDXkIDOfSPkvQOeBa7almMPeU0IUrMaHDUBZFRKUpTX1nrVwhnVrRqLUpF4PRfA2wkj3LhtWRyZGF/4/d3zqpOfJnIeR2DPHMso8Ah9BnyidiOyH++YRQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1752015082; c=relaxed/simple; bh=Gfh2pOFfNHtYQibe7rygJ2dlJdseH0NWI5Z17gyse4I=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=SBT3musYoo2LUVJEq9uyhpGrrWtJNoWGUDAwtz8l4HEFil4xfd7VpFPJNHjSXbD/Kc5uQifsCHXa1PesRWfYMK9UA3szLcjSH8IDMECUfIndKqm2W/poHmaBSa62NAsRRxc2lqb48ycEUiviXnx+y83zHfsGSTnR30sg8gRda60= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1F3A73857820 Received: from mail231.csoft.net (localhost [127.0.0.1]) by mail231.csoft.net (Postfix) with ESMTP id C741B45C1D for ; Tue, 08 Jul 2025 18:51:21 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=jdrake.com; h=date:from:to :subject:message-id:mime-version:content-type; s=csoft; bh=9oulj Fo5r3hApmp4piWJ5CWfCx0=; b=c4iwlniDqHX7a1d9Et94NuK9mvCQ74DQdEYL1 OjFRLxRoxOv8rRpVfj3UJ3eNkVHCJQzNrWKTZAK3N+VeRjkdUmBc1drFev3e8Nr6 9r9Cwvy/n5JrdHEFD+hbVXNMH7Y4hLhjfd9wUpoKNf1Rp/S4kTXCj7jCNBQp4eZD lZ9fw8= Received: from mail231 (mail231 [66.216.5.135]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) (Authenticated sender: jeremyd) by mail231.csoft.net (Postfix) with ESMTPSA id AFD4845A5F for ; Tue, 08 Jul 2025 18:51:21 -0400 (EDT) Date: Tue, 8 Jul 2025 15:51:21 -0700 (PDT) From: Jeremy Drake X-X-Sender: jeremyd@resin.csoft.net To: newlib@sourceware.org Subject: [PATCH] posix_spawn: preserve FD flags when processing FAE_OPEN Message-ID: <8a4f16ba-7d34-f522-5d83-c22de0589830@jdrake.com> MIME-Version: 1.0 X-Spam-Status: No, score=-9.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org According to the POSIX documentation, "when the new process image is executed, any file descriptor (from this new set) which has its FD_CLOEXEC flag set shall be closed (see posix_spawn())." The "new set" is after processing the file actions, so if addopen had the O_CLOEXEC flag set the descriptor should be closed after the exec. The adddup2 docs, by contrast, specify that the flag should be cleared, even if dup2 wouldn't have done so due to the specified file descriptors being equal. Add a comment to that effect. Addresses: https://sourceware.org/pipermail/newlib/2025/021968.html Fixes: c7c1a1ca1b ("2013-10-01 Petr Hosek ") Signed-off-by: Jeremy Drake --- newlib/libc/posix/posix_spawn.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/newlib/libc/posix/posix_spawn.c b/newlib/libc/posix/posix_spawn.c index 51ad23f825..f63b3af8f1 100644 --- a/newlib/libc/posix/posix_spawn.c +++ b/newlib/libc/posix/posix_spawn.c @@ -179,23 +179,31 @@ process_file_actions_entry(posix_spawn_file_actions_entry_t *fae) if (fd < 0) return (errno); if (fd != fae->fae_fildes) { +#ifdef HAVE_FCNTL + int fdflags = _fcntl(fd, F_GETFD); + if (fdflags == -1) + return (errno); +#endif if (dup2(fd, fae->fae_fildes) == -1) return (errno); if (_close(fd) != 0) { if (errno == EBADF) return (EBADF); } - } #ifdef HAVE_FCNTL - if (_fcntl(fae->fae_fildes, F_SETFD, 0) == -1) - return (errno); + if (_fcntl(fae->fae_fildes, F_SETFD, fdflags) == -1) + return (errno); #endif /* HAVE_FCNTL */ + } break; case FAE_DUP2: /* Perform a dup2() */ if (dup2(fae->fae_fildes, fae->fae_newfildes) == -1) return (errno); #ifdef HAVE_FCNTL + /* This is necessary because POSIX says the FD_CLOEXEC flag + * must be clear, even though dup2 is specified to not clear + * the FD_CLOEXEC flag if the two file descriptors are equal */ if (_fcntl(fae->fae_newfildes, F_SETFD, 0) == -1) return (errno); #endif /* HAVE_FCNTL */