[lxc-devel] [lxc/master] attach: bugfixes

brauner on Github lxc-bot at linuxcontainers.org
Mon Aug 20 23:21:08 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180820/3c867f79/attachment.bin>
-------------- next part --------------
From 78726836dab46ab38ef9adfd9676de6f4c24b0ee Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 21 Aug 2018 01:05:14 +0200
Subject: [PATCH 1/3] macro: s/rexit()/_exit()/g

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/attach.c | 22 +++++++---------------
 src/lxc/macro.h  |  9 +++++++++
 2 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/src/lxc/attach.c b/src/lxc/attach.c
index f992b4f99..9d866902a 100644
--- a/src/lxc/attach.c
+++ b/src/lxc/attach.c
@@ -652,14 +652,6 @@ static void lxc_attach_get_init_uidgid(uid_t *init_uid, gid_t *init_gid)
 	 */
 }
 
-/* Help the optimizer along if it doesn't know that exit always exits. */
-#define rexit(c)                                                               \
-	do {                                                                   \
-		int __c = (c);                                                 \
-		_exit(__c);                                                    \
-		return __c;                                                    \
-	} while (0)
-
 /* Define default options if no options are supplied by the user. */
 static lxc_attach_options_t attach_static_default_options = LXC_ATTACH_OPTIONS_DEFAULT;
 
@@ -986,11 +978,11 @@ static int attach_child_main(struct attach_clone_payload *payload)
 	}
 
 	/* We're done, so we can now do whatever the user intended us to do. */
-	rexit(payload->exec_function(payload->exec_payload));
+	_exit(payload->exec_function(payload->exec_payload));
 
 on_error:
 	lxc_put_attach_clone_payload(payload);
-	rexit(EXIT_FAILURE);
+	_exit(EXIT_FAILURE);
 }
 
 static int lxc_attach_terminal(struct lxc_conf *conf,
@@ -1447,7 +1439,7 @@ int lxc_attach(const char *name, const char *lxcpath,
 	if (ret != sizeof(status)) {
 		shutdown(ipc_sockets[1], SHUT_RDWR);
 		lxc_proc_put_context_info(init_ctx);
-		rexit(-1);
+		_exit(EXIT_FAILURE);
 	}
 
 	TRACE("Intermediate process starting to initialize");
@@ -1460,7 +1452,7 @@ int lxc_attach(const char *name, const char *lxcpath,
 		ERROR("Failed to enter namespaces");
 		shutdown(ipc_sockets[1], SHUT_RDWR);
 		lxc_proc_put_context_info(init_ctx);
-		rexit(-1);
+		_exit(EXIT_FAILURE);
 	}
 
 	/* close namespace file descriptors */
@@ -1491,7 +1483,7 @@ int lxc_attach(const char *name, const char *lxcpath,
 		SYSERROR("Failed to clone attached process");
 		shutdown(ipc_sockets[1], SHUT_RDWR);
 		lxc_proc_put_context_info(init_ctx);
-		rexit(-1);
+		_exit(EXIT_FAILURE);
 	}
 
 	if (pid == 0) {
@@ -1516,14 +1508,14 @@ int lxc_attach(const char *name, const char *lxcpath,
 		 */
 		shutdown(ipc_sockets[1], SHUT_RDWR);
 		lxc_proc_put_context_info(init_ctx);
-		rexit(-1);
+		_exit(EXIT_FAILURE);
 	}
 
 	TRACE("Sending pid %d of attached process", pid);
 
 	/* The rest is in the hands of the initial and the attached process. */
 	lxc_proc_put_context_info(init_ctx);
-	rexit(0);
+	_exit(0);
 }
 
 int lxc_attach_run_command(void* payload)
diff --git a/src/lxc/macro.h b/src/lxc/macro.h
index 6113adc2e..5f1b4334f 100644
--- a/src/lxc/macro.h
+++ b/src/lxc/macro.h
@@ -27,6 +27,7 @@
 #include <linux/loop.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
+#include <stdbool.h>
 #include <sys/mount.h>
 #include <sys/socket.h>
 
@@ -222,4 +223,12 @@ extern int __build_bug_on_failed;
 #define MS_SLAVE (1 << 19)
 #endif
 
+/* Help the optimizer along if it doesn't know that exit always exits. */
+#define rexit(c)               \
+	do {                   \
+		int __c = (c); \
+		_exit(__c);    \
+		return __c;    \
+	} while (false)
+
 #endif /* __LXC_MACRO_H */

From 88b5ffc7157ec794e4eee1555430c056f2ed33a1 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 21 Aug 2018 01:06:05 +0200
Subject: [PATCH 2/3] attach: move struct declaration to top

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/attach.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/lxc/attach.c b/src/lxc/attach.c
index 9d866902a..4965e1e8e 100644
--- a/src/lxc/attach.c
+++ b/src/lxc/attach.c
@@ -89,6 +89,9 @@
 
 lxc_log_define(attach, lxc);
 
+/* Define default options if no options are supplied by the user. */
+static lxc_attach_options_t attach_static_default_options = LXC_ATTACH_OPTIONS_DEFAULT;
+
 /* /proc/pid-to-str/status\0 = (5 + 21 + 7 + 1) */
 #define __PROC_STATUS_LEN (5 + (LXC_NUMSTRLEN64) + 7 + 1)
 static struct lxc_proc_context_info *lxc_proc_get_context_info(pid_t pid)
@@ -652,9 +655,6 @@ static void lxc_attach_get_init_uidgid(uid_t *init_uid, gid_t *init_gid)
 	 */
 }
 
-/* Define default options if no options are supplied by the user. */
-static lxc_attach_options_t attach_static_default_options = LXC_ATTACH_OPTIONS_DEFAULT;
-
 static bool fetch_seccomp(struct lxc_container *c, lxc_attach_options_t *options)
 {
 	int ret;

From ed4d7885325a7fdb0e37ab10adca497c234efc39 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 21 Aug 2018 01:09:19 +0200
Subject: [PATCH 3/3] macro: move macros from attach.c

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 src/lxc/attach.c | 44 +++++++++-----------------------------------
 src/lxc/macro.h  | 20 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 35 deletions(-)

diff --git a/src/lxc/attach.c b/src/lxc/attach.c
index 4965e1e8e..741767ed4 100644
--- a/src/lxc/attach.c
+++ b/src/lxc/attach.c
@@ -24,36 +24,24 @@
 #define _GNU_SOURCE
 #include <errno.h>
 #include <fcntl.h>
-#include <termios.h>
 #include <grp.h>
+#include <linux/unistd.h>
 #include <pwd.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
-#include <linux/unistd.h>
 #include <sys/mount.h>
 #include <sys/param.h>
 #include <sys/prctl.h>
 #include <sys/socket.h>
 #include <sys/syscall.h>
 #include <sys/wait.h>
+#include <termios.h>
+#include <unistd.h>
 
 #include <lxc/lxccontainer.h>
 
-#ifndef HAVE_DECL_PR_CAPBSET_DROP
-#define PR_CAPBSET_DROP 24
-#endif
-
-#ifndef HAVE_DECL_PR_SET_NO_NEW_PRIVS
-#define PR_SET_NO_NEW_PRIVS 38
-#endif
-
-#ifndef HAVE_DECL_PR_GET_NO_NEW_PRIVS
-#define PR_GET_NO_NEW_PRIVS 39
-#endif
-
 #include "af_unix.h"
 #include "attach.h"
 #include "caps.h"
@@ -75,38 +63,24 @@
 #include <sys/personality.h>
 #endif
 
-#ifndef SOCK_CLOEXEC
-#define SOCK_CLOEXEC 02000000
-#endif
-
-#ifndef MS_REC
-#define MS_REC 16384
-#endif
-
-#ifndef MS_SLAVE
-#define MS_SLAVE (1 << 19)
-#endif
-
 lxc_log_define(attach, lxc);
 
 /* Define default options if no options are supplied by the user. */
 static lxc_attach_options_t attach_static_default_options = LXC_ATTACH_OPTIONS_DEFAULT;
 
-/* /proc/pid-to-str/status\0 = (5 + 21 + 7 + 1) */
-#define __PROC_STATUS_LEN (5 + (LXC_NUMSTRLEN64) + 7 + 1)
 static struct lxc_proc_context_info *lxc_proc_get_context_info(pid_t pid)
 {
 	int ret;
 	bool found;
 	FILE *proc_file;
-	char proc_fn[__PROC_STATUS_LEN];
+	char proc_fn[LXC_PROC_STATUS_LEN];
 	size_t line_bufsz = 0;
 	char *line = NULL;
 	struct lxc_proc_context_info *info = NULL;
 
 	/* Read capabilities. */
-	ret = snprintf(proc_fn, __PROC_STATUS_LEN, "/proc/%d/status", pid);
-	if (ret < 0 || ret >= __PROC_STATUS_LEN)
+	ret = snprintf(proc_fn, LXC_PROC_STATUS_LEN, "/proc/%d/status", pid);
+	if (ret < 0 || ret >= LXC_PROC_STATUS_LEN)
 		goto on_error;
 
 	proc_file = fopen(proc_fn, "r");
@@ -607,7 +581,7 @@ static char *lxc_attach_getpwshell(uid_t uid)
 static void lxc_attach_get_init_uidgid(uid_t *init_uid, gid_t *init_gid)
 {
 	FILE *proc_file;
-	char proc_fn[__PROC_STATUS_LEN];
+	char proc_fn[LXC_PROC_STATUS_LEN];
 	int ret;
 	char *line = NULL;
 	size_t line_bufsz = 0;
@@ -615,8 +589,8 @@ static void lxc_attach_get_init_uidgid(uid_t *init_uid, gid_t *init_gid)
 	uid_t uid = (uid_t)-1;
 	gid_t gid = (gid_t)-1;
 
-	ret = snprintf(proc_fn, __PROC_STATUS_LEN, "/proc/%d/status", 1);
-	if (ret < 0 || ret >= __PROC_STATUS_LEN)
+	ret = snprintf(proc_fn, LXC_PROC_STATUS_LEN, "/proc/%d/status", 1);
+	if (ret < 0 || ret >= LXC_PROC_STATUS_LEN)
 		return;
 
 	proc_file = fopen(proc_fn, "r");
diff --git a/src/lxc/macro.h b/src/lxc/macro.h
index 5f1b4334f..f44b220b4 100644
--- a/src/lxc/macro.h
+++ b/src/lxc/macro.h
@@ -68,6 +68,19 @@
 #define CAP_SYS_ADMIN 21
 #endif
 
+#ifndef HAVE_DECL_PR_CAPBSET_DROP
+#define PR_CAPBSET_DROP 24
+#endif
+
+/* prctl */
+#ifndef HAVE_DECL_PR_SET_NO_NEW_PRIVS
+#define PR_SET_NO_NEW_PRIVS 38
+#endif
+
+#ifndef HAVE_DECL_PR_GET_NO_NEW_PRIVS
+#define PR_GET_NO_NEW_PRIVS 39
+#endif
+
 #ifndef CGROUP_SUPER_MAGIC
 #define CGROUP_SUPER_MAGIC 0x27e0eb
 #endif
@@ -97,6 +110,8 @@
  * \0           =    1
  */
 #define LXC_PROC_PID_FD_LEN (6 + LXC_NUMSTRLEN64 + 4 + LXC_NUMSTRLEN64 + 1)
+/* /proc/pid-to-str/status\0 = (5 + 21 + 7 + 1) */
+#define LXC_PROC_STATUS_LEN (5 + (LXC_NUMSTRLEN64) + 7 + 1)
 
 /* loop devices */
 #ifndef LO_FLAGS_AUTOCLEAR
@@ -223,6 +238,11 @@ extern int __build_bug_on_failed;
 #define MS_SLAVE (1 << 19)
 #endif
 
+/* sockets */
+#ifndef SOCK_CLOEXEC
+#define SOCK_CLOEXEC 02000000
+#endif
+
 /* Help the optimizer along if it doesn't know that exit always exits. */
 #define rexit(c)               \
 	do {                   \


More information about the lxc-devel mailing list