From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"Anthony PERARD" <anthony@xenproject.org>,
"Juergen Gross" <jgross@suse.com>,
"Roger Pau Monné" <roger.pau@citrix.com>,
"Frediano Ziglio" <frediano.ziglio@cloud.com>,
"Oleksii Kurochko" <oleksii.kurochko@gmail.com>
Subject: [PATCH for-4.19 1/3] tools/libxs: Fix CLOEXEC handling in get_dev()
Date: Fri, 28 Jun 2024 15:31:14 +0100 [thread overview]
Message-ID: <20240628143116.1044976-2-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <20240628143116.1044976-1-andrew.cooper3@citrix.com>
Move the O_CLOEXEC compatibility outside of an #ifdef USE_PTHREAD block.
Introduce set_cloexec() to wrap fcntl() setting FD_CLOEXEC. It will be reused
for other CLOEXEC fixes too.
Use set_cloexec() when O_CLOEXEC isn't available as a best-effort fallback.
Fixes: f4f2f3402b2f ("tools/libxs: Open /dev/xen/xenbus fds as O_CLOEXEC")
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Anthony PERARD <anthony@xenproject.org>
CC: Juergen Gross <jgross@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Frediano Ziglio <frediano.ziglio@cloud.com>
CC: Oleksii Kurochko <oleksii.kurochko@gmail.com>
---
tools/libs/store/xs.c | 38 ++++++++++++++++++++++++++++++++------
1 file changed, 32 insertions(+), 6 deletions(-)
diff --git a/tools/libs/store/xs.c b/tools/libs/store/xs.c
index 14985150737e..037e79d98b58 100644
--- a/tools/libs/store/xs.c
+++ b/tools/libs/store/xs.c
@@ -40,6 +40,10 @@
#include <xentoolcore_internal.h>
#include <xen_list.h>
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+
struct xs_stored_msg {
XEN_TAILQ_ENTRY(struct xs_stored_msg) list;
struct xsd_sockmsg hdr;
@@ -54,10 +58,6 @@ struct xs_stored_msg {
#include <dlfcn.h>
#endif
-#ifndef O_CLOEXEC
-#define O_CLOEXEC 0
-#endif
-
struct xs_handle {
/* Communications channel to xenstore daemon. */
int fd;
@@ -176,6 +176,16 @@ static bool setnonblock(int fd, int nonblock) {
return true;
}
+static bool set_cloexec(int fd)
+{
+ int flags = fcntl(fd, F_GETFL);
+
+ if (flags < 0)
+ return false;
+
+ return fcntl(fd, flags | FD_CLOEXEC) >= 0;
+}
+
int xs_fileno(struct xs_handle *h)
{
char c = 0;
@@ -230,8 +240,24 @@ static int get_socket(const char *connect_to)
static int get_dev(const char *connect_to)
{
- /* We cannot open read-only because requests are writes */
- return open(connect_to, O_RDWR | O_CLOEXEC);
+ int fd, saved_errno;
+
+ fd = open(connect_to, O_RDWR | O_CLOEXEC);
+ if (fd < 0)
+ return -1;
+
+ /* Compat for non-O_CLOEXEC environments. Racy. */
+ if (!O_CLOEXEC && !set_cloexec(fd))
+ goto error;
+
+ return fd;
+
+error:
+ saved_errno = errno;
+ close(fd);
+ errno = saved_errno;
+
+ return -1;
}
static int all_restrict_cb(Xentoolcore__Active_Handle *ah, domid_t domid) {
--
2.39.2
next prev parent reply other threads:[~2024-06-28 14:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-28 14:31 [PATCH for-4.19(?) 0/3] tools/libxs: More CLOEXEC fixes Andrew Cooper
2024-06-28 14:31 ` Andrew Cooper [this message]
2024-06-28 14:31 ` [PATCH for-4.19 2/3] tools/libxs: Fix CLOEXEC handling in get_socket() Andrew Cooper
2024-06-28 14:31 ` [PATCH for-4.19 3/3] tools/libxs: Fix CLOEXEC handling in xs_fileno() Andrew Cooper
2024-07-01 9:03 ` [PATCH for-4.19(?) 0/3] tools/libxs: More CLOEXEC fixes Jürgen Groß
2024-07-01 9:28 ` Anthony PERARD
2024-07-01 15:06 ` Oleksii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240628143116.1044976-2-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=anthony@xenproject.org \
--cc=frediano.ziglio@cloud.com \
--cc=jgross@suse.com \
--cc=oleksii.kurochko@gmail.com \
--cc=roger.pau@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.