[lxc-devel] [lxd/master] lxd: remove /proc/self/cmdline parsing

brauner on Github lxc-bot at linuxcontainers.org
Wed Feb 13 22:41:52 UTC 2019


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/20190213/b336def9/attachment.bin>
-------------- next part --------------
From 5e9002a3ff7026c879e2ec29d7dd0d3782ce7794 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Wed, 13 Feb 2019 23:40:52 +0100
Subject: [PATCH] lxd: remove /proc/self/cmdline parsing

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/main_nsexec.go | 53 +++++++++++-----------------------------------
 1 file changed, 12 insertions(+), 41 deletions(-)

diff --git a/lxd/main_nsexec.go b/lxd/main_nsexec.go
index c03a5d24f0..e78354add5 100644
--- a/lxd/main_nsexec.go
+++ b/lxd/main_nsexec.go
@@ -42,17 +42,10 @@ extern void forkproxy();
 extern void forkuevent();
 
 // Command line parsing and tracking
-#define CMDLINE_SIZE (8 * PATH_MAX)
-char cmdline_buf[CMDLINE_SIZE];
-char *cmdline_cur = NULL;
-ssize_t cmdline_size = -1;
+size_t cmdline_index = 0;
 
-char* advance_arg(bool required) {
-	while (*cmdline_cur != 0)
-		cmdline_cur++;
-
-	cmdline_cur++;
-	if (cmdline_size <= cmdline_cur - cmdline_buf) {
+char* advance_arg(char *argv[], bool required) {
+	if (!argv[cmdline_index++]) {
 		if (!required)
 			return NULL;
 
@@ -60,7 +53,7 @@ char* advance_arg(bool required) {
 		_exit(1);
 	}
 
-	return cmdline_cur;
+	return argv[cmdline_index];
 }
 
 void error(char *msg)
@@ -210,46 +203,24 @@ void attach_userns(int pid) {
 	}
 }
 
-__attribute__((constructor)) void init(void) {
-	int cmdline;
-
-	// Extract arguments
-	cmdline = open("/proc/self/cmdline", O_RDONLY);
-	if (cmdline < 0) {
-		error("error: open");
-		_exit(232);
-	}
-
-	memset(cmdline_buf, 0, sizeof(cmdline_buf));
-	if ((cmdline_size = read(cmdline, cmdline_buf, sizeof(cmdline_buf)-1)) < 0) {
-		close(cmdline);
-		error("error: read");
-		_exit(232);
-	}
-	close(cmdline);
-
-	// Skip the first argument (but don't fail on missing second argument)
-	cmdline_cur = cmdline_buf;
-	while (*cmdline_cur != 0)
-		cmdline_cur++;
-	cmdline_cur++;
-	if (cmdline_size <= cmdline_cur - cmdline_buf) {
+__attribute__((constructor)) void init(int argc, char *argv[]) {
+	if (!argv[1]) {
 		checkfeature();
 		return;
 	}
 
 	// Intercepts some subcommands
-	if (strcmp(cmdline_cur, "forkfile") == 0)
+	if (strcmp(argv[1], "forkfile") == 0)
 		forkfile();
-	else if (strcmp(cmdline_cur, "forkmount") == 0)
+	else if (strcmp(argv[1], "forkmount") == 0)
 		forkmount();
-	else if (strcmp(cmdline_cur, "forknet") == 0)
+	else if (strcmp(argv[1], "forknet") == 0)
 		forknet();
-	else if (strcmp(cmdline_cur, "forkproxy") == 0)
+	else if (strcmp(argv[1], "forkproxy") == 0)
 		forkproxy();
-	else if (strcmp(cmdline_cur, "forkuevent") == 0)
+	else if (strcmp(argv[1], "forkuevent") == 0)
 		forkuevent();
-	else if (strncmp(cmdline_cur, "-", 1) == 0 || strcmp(cmdline_cur, "daemon") == 0)
+	else if (strncmp(argv[1], "-", 1) == 0 || strcmp(argv[1], "daemon") == 0)
 		checkfeature();
 }
 */


More information about the lxc-devel mailing list