The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5494

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
The ELF binary spec doesn specify:

SHT_INIT_ARRAY
This section contains an array of pointers to initialization functions,
as described in ``Initialization and Termination Functions'' in Chapter
5. Each pointer in the array is taken as a parameterless procedure with
a void return.

which means libcs other than glibc might not pass down argc and argv to
constructors.

This reverts commit 2149bdaf895a1145d49e7627b50e0097678de189.

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 4f4b5c57c3d4bd75bde3035e3c8f3ece7b71b7d1 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 14 Feb 2019 14:35:10 +0100
Subject: [PATCH] Revert "lxd: remove /proc/self/cmdline parsing"

The ELF binary spec doesn specify:

SHT_INIT_ARRAY
This section contains an array of pointers to initialization functions,
as described in ``Initialization and Termination Functions'' in Chapter
5. Each pointer in the array is taken as a parameterless procedure with
a void return.

which means libcs other than glibc might not pass down argc and argv to
constructors.

This reverts commit 2149bdaf895a1145d49e7627b50e0097678de189.

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 lxd/main_forkfile.go |  4 ----
 lxd/main_nsexec.go   | 54 ++++++++++++++++++++++++++++++++------------
 2 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/lxd/main_forkfile.go b/lxd/main_forkfile.go
index 24576da18b..38030e2ae0 100644
--- a/lxd/main_forkfile.go
+++ b/lxd/main_forkfile.go
@@ -409,10 +409,6 @@ void forkfile() {
 
        // Get the subcommand
        command = advance_arg(false);
-       if (command)
-               fprintf(stderr, "BBBB: %s\n", command);
-       else
-               fprintf(stderr, "CCCC\n");
        if (command == NULL || (strcmp(command, "--help") == 0 || 
strcmp(command, "--version") == 0 || strcmp(command, "-h") == 0)) {
                return;
        }
diff --git a/lxd/main_nsexec.go b/lxd/main_nsexec.go
index 789ad7b914..c03a5d24f0 100644
--- a/lxd/main_nsexec.go
+++ b/lxd/main_nsexec.go
@@ -42,12 +42,17 @@ extern void forkproxy();
 extern void forkuevent();
 
 // Command line parsing and tracking
-#define CMDLINE_INDEX_SKIP_SELF 1
-size_t cmdline_index = CMDLINE_INDEX_SKIP_SELF;
-char **cmdline;
+#define CMDLINE_SIZE (8 * PATH_MAX)
+char cmdline_buf[CMDLINE_SIZE];
+char *cmdline_cur = NULL;
+ssize_t cmdline_size = -1;
 
 char* advance_arg(bool required) {
-       if (!cmdline[cmdline_index]) {
+       while (*cmdline_cur != 0)
+               cmdline_cur++;
+
+       cmdline_cur++;
+       if (cmdline_size <= cmdline_cur - cmdline_buf) {
                if (!required)
                        return NULL;
 
@@ -55,7 +60,7 @@ char* advance_arg(bool required) {
                _exit(1);
        }
 
-       return cmdline[cmdline_index++];
+       return cmdline_cur;
 }
 
 void error(char *msg)
@@ -205,27 +210,46 @@ void attach_userns(int pid) {
        }
 }
 
-__attribute__((constructor)) void init(int argc, char *argv[]) {
-       cmdline = argv;
+__attribute__((constructor)) void init(void) {
+       int cmdline;
+
+       // Extract arguments
+       cmdline = open("/proc/self/cmdline", O_RDONLY);
+       if (cmdline < 0) {
+               error("error: open");
+               _exit(232);
+       }
 
-       char *cmd = advance_arg(false);
-       if (!cmd) {
+       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) {
                checkfeature();
                return;
        }
 
        // Intercepts some subcommands
-       if (strcmp(cmd, "forkfile") == 0)
+       if (strcmp(cmdline_cur, "forkfile") == 0)
                forkfile();
-       else if (strcmp(cmd, "forkmount") == 0)
+       else if (strcmp(cmdline_cur, "forkmount") == 0)
                forkmount();
-       else if (strcmp(cmd, "forknet") == 0)
+       else if (strcmp(cmdline_cur, "forknet") == 0)
                forknet();
-       else if (strcmp(cmd, "forkproxy") == 0)
+       else if (strcmp(cmdline_cur, "forkproxy") == 0)
                forkproxy();
-       else if (strcmp(cmd, "forkuevent") == 0)
+       else if (strcmp(cmdline_cur, "forkuevent") == 0)
                forkuevent();
-       else if (strncmp(cmd, "-", 1) == 0 || strcmp(cmdline[1], "daemon") == 0)
+       else if (strncmp(cmdline_cur, "-", 1) == 0 || strcmp(cmdline_cur, 
"daemon") == 0)
                checkfeature();
 }
 */
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to