]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
don't truncate environment sometimes in setproctitle
authorTycho Andersen <tycho.andersen@canonical.com>
Mon, 16 Nov 2015 22:12:36 +0000 (15:12 -0700)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 17 Nov 2015 16:32:02 +0000 (11:32 -0500)
Instead, let's just allocate new space for the proctitle to live and point
the kernel at that.

v2: take out testing hunk
v3: check return from realloc

Signed-off-by: Tycho Andersen <tycho.andersen@canonical.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/utils.c

index dac64188586f7802a0a55e3aff220f6783a09690..ad9b0a294ceb26d41b289dcfa4f9d3267fd3d856 100644 (file)
@@ -1349,6 +1349,7 @@ char *get_template_path(const char *t)
  */
 int setproctitle(char *title)
 {
+       static char *proctitle = NULL;
        char buf[2048], *tmp;
        FILE *f;
        int i, len, ret = 0;
@@ -1413,28 +1414,21 @@ int setproctitle(char *title)
         * want to have room for it. */
        len = strlen(title) + 1;
 
-       /* We're truncating the environment, so we should use at most the
-        * length of the argument + environment for the title. */
-       if (len > env_end - arg_start) {
-               arg_end = env_end;
-               len = env_end - arg_start;
-               title[len-1] = '\0';
-       } else {
-               /* Only truncate the environment if we're actually going to
-                * overwrite part of it. */
-               if (len >= arg_end - arg_start) {
-                       env_start = env_end;
-               }
-
-               arg_end = arg_start + len;
-
-               /* check overflow */
-               if (arg_end < len || arg_end < arg_start) {
+       /* If we don't have enough room by just overwriting the old proctitle,
+        * let's allocate a new one.
+        */
+       if (len > arg_end - arg_start) {
+               void *m;
+               m = realloc(proctitle, len);
+               if (!m)
                        return -1;
-               }
+               proctitle = m;
 
+               arg_start = (unsigned long) proctitle;
        }
 
+       arg_end = arg_start + len;
+
        brk_val = syscall(__NR_brk, 0);
 
        prctl_map = (struct prctl_mm_map) {