[lxc-users] library start() API from process name having spaces

Chaetoo3 Chaetoo3 at protonmail.com
Wed Jul 4 19:23:19 UTC 2018


Hi!

I try to use the liblxc start() API from my process and it worked, but I notice it would not set the process name for the container process as it would do from the lxc-start command line.  Instead the container process stayed with the name of my caller.

I sniff around and make a local fix.  I'm sorry I do not know how to contribute this to lxc, but if anyone want to do that, here is the code.  Reason is: /proc/self/stat contains the process name in parentheses.  If the name contains space, when liblxc parse the file it would get off by one field, and get confused and fail in setproctitle().

I don't know if my fix is robust enough for real, but at least should point someone to the right place?  This looks for trailing ") " sequence (parent and space).  That is still subject to errors because the process name might include such, but maybe there is not a way to avoid a false positive sometimes.  You cannot paren match either, because a process may not have matching.  Well anyway, this at least account for spaces in process name, which is a little bit common situation I think.

I hope it would help someone.


@@ -296,10 +296,23 @@ int setproctitle(char *title)
                return -1;
        }
 
-       /* Skip the first 25 fields, column 26-28 are start_code, end_code,
+        /* Find the end of the process name, which is bounded by parentheses.
+         * Some processes may include parens in their name, which in the worst
+         * case can trigger a false positive no matter what we do here.  This
+         * tries to avoid that by looking for a ') ' sequence.
+         */
+       tmp = buf;
+
+       while (tmp[0] && tmp[1] && tmp[0] != ')' && tmp[1] != ' ') {
+               tmp = strchr(tmp + 1, ')');
+               if (!tmp)
+                       return -1;
+       }
+
+       /* Skip the next 23 fields, column 26-28 are start_code, end_code,
         * and start_stack */
-       tmp = strchr(buf, ' ');
-       for (i = 0; i < 24; i++) {
+       tmp = strchr(tmp+1, ' ');
+       for (i = 0; i < 23; i++) {
                if (!tmp)
                        return -1;
                tmp = strchr(tmp+1, ' ');




More information about the lxc-users mailing list