If /var/run is a symlink to /run in the container, then opening
/proc/<pid>/root/var/run/utmp will end up opening the host's utmp.
Therefore the hack detecting shutdown through utmp fails.

Signed-off-by: Serge Hallyn <serge.hal...@canonical.com>

Index: lxc/src/lxc/utmp.c
===================================================================
--- lxc.orig/src/lxc/utmp.c     2011-07-28 12:16:21.973116768 -0500
+++ lxc/src/lxc/utmp.c  2011-07-28 12:50:47.295227858 -0500
@@ -170,6 +170,15 @@
        char path[MAXPATHLEN];
        struct lxc_handler *handler = utmp_data->handler;
 
+       if (snprintf(path, MAXPATHLEN, "/proc/%d/root/run/utmp",
+                    handler->pid) > MAXPATHLEN) {
+               ERROR("path is too long");
+               return -1;
+       }
+
+       if (!access(path, F_OK) && !utmpxname(path))
+               goto utmp_ok;
+
        if (snprintf(path, MAXPATHLEN, "/proc/%d/root/var/run/utmp",
                     handler->pid) > MAXPATHLEN) {
                ERROR("path is too long");
@@ -181,6 +190,8 @@
                return -1;
        }
 
+utmp_ok:
+
        setutxent();
 
        while ((utmpx = getutxent())) {
@@ -219,6 +230,7 @@
                          struct lxc_handler *handler)
 {
        char path[MAXPATHLEN];
+       char path2[MAXPATHLEN];
        int fd, wd;
        struct lxc_utmp *utmp_data;
        struct lxc_conf *conf = handler->conf;
@@ -230,6 +242,19 @@
         * in utmp at the moment, but want to watch for delete and create
         * events as well.
         */
+       if (snprintf(path, MAXPATHLEN, "/proc/%d/root/run",
+                    handler->pid) > MAXPATHLEN) {
+               ERROR("path is too long");
+               return -1;
+       }
+       if (snprintf(path2, MAXPATHLEN, "/proc/%d/root/run/utmp",
+                    handler->pid) > MAXPATHLEN) {
+               ERROR("path is too long");
+               return -1;
+       }
+       if (!access(path2, F_OK))
+               goto run_ok;
+
        if (snprintf(path, MAXPATHLEN, "/proc/%d/root/var/run",
                     handler->pid) > MAXPATHLEN) {
                ERROR("path is too long");
@@ -241,6 +266,8 @@
                return 0;
        }
 
+run_ok:
+
        utmp_data = (struct lxc_utmp *)malloc(sizeof(struct lxc_utmp));
 
        if (NULL == utmp_data) {

------------------------------------------------------------------------------
Got Input?   Slashdot Needs You.
Take our quick survey online.  Come on, we don't ask for help often.
Plus, you'll get a chance to win $100 to spend on ThinkGeek.
http://p.sf.net/sfu/slashdot-survey
_______________________________________________
Lxc-users mailing list
Lxc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-users

Reply via email to