From fa40930b1e472a99545fa0f5a2b799b9e447ef27 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 26 Apr 2021 18:57:55 +0200 Subject: [PATCH 1/2] contrib: fix warning from the rust compiler Signed-off-by: Giuseppe Scrivano --- contrib/seccomp-notify-plugin-rust/src/seccompwatcher.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/seccomp-notify-plugin-rust/src/seccompwatcher.rs b/contrib/seccomp-notify-plugin-rust/src/seccompwatcher.rs index 974d83855f..d2872674d2 100644 --- a/contrib/seccomp-notify-plugin-rust/src/seccompwatcher.rs +++ b/contrib/seccomp-notify-plugin-rust/src/seccompwatcher.rs @@ -26,7 +26,6 @@ type Errno = i32; type SyscallHandler = fn(req: &mut nc::seccomp_notif_t) -> Result; -#[no_mangle] pub struct LibcrunLoadSeccompNotifyConf { _runtime_root_path: *const c_char, _name: *const c_char, From 55f5ed5bc300d452e68224d1c64090ff4d53ba28 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 26 Apr 2021 18:56:44 +0200 Subject: [PATCH 2/2] utils: use /proc/self/fd to open unix socket when the patch is longer than sizeof (sockaddr_un.sun_path) Signed-off-by: Giuseppe Scrivano --- src/libcrun/utils.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/libcrun/utils.c b/src/libcrun/utils.c index b1effe8d5c..27cb92174b 100644 --- a/src/libcrun/utils.c +++ b/src/libcrun/utils.c @@ -878,12 +878,24 @@ open_unix_domain_client_socket (const char *path, int dgram, libcrun_error_t *er { struct sockaddr_un addr = {}; int ret; - cleanup_close int fd = socket (AF_UNIX, dgram ? SOCK_DGRAM : SOCK_STREAM, 0); + char name_buf[32]; + cleanup_close int destfd = -1; + cleanup_close int fd = -1; + + fd = socket (AF_UNIX, dgram ? SOCK_DGRAM : SOCK_STREAM, 0); if (UNLIKELY (fd < 0)) return crun_make_error (err, errno, "error creating UNIX socket"); if (strlen (path) >= sizeof (addr.sun_path)) - return crun_make_error (err, 0, "invalid path %s specified", path); + { + destfd = open (path, O_PATH); + if (UNLIKELY (destfd < 0)) + return crun_make_error (err, errno, "error opening `%s`", path); + + sprintf (name_buf, "/proc/self/fd/%d", destfd); + path = name_buf; + } + strcpy (addr.sun_path, path); addr.sun_family = AF_UNIX; ret = connect (fd, (struct sockaddr *) &addr, sizeof (addr)); @@ -901,12 +913,16 @@ open_unix_domain_socket (const char *path, int dgram, libcrun_error_t *err) { struct sockaddr_un addr = {}; int ret; + char name_buf[32]; cleanup_close int fd = socket (AF_UNIX, dgram ? SOCK_DGRAM : SOCK_STREAM, 0); if (UNLIKELY (fd < 0)) return crun_make_error (err, errno, "error creating UNIX socket"); if (strlen (path) >= sizeof (addr.sun_path)) - return crun_make_error (err, 0, "invalid path %s specified", path); + { + sprintf (name_buf, "/proc/self/fd/%d", fd); + path = name_buf; + } strcpy (addr.sun_path, path); addr.sun_family = AF_UNIX; ret = bind (fd, (struct sockaddr *) &addr, sizeof (addr));