]> mj.ucw.cz Git - moe.git/commitdiff
Box: Re-open /proc/$PID/mem on exec
authorMartin Mares <mj@ucw.cz>
Sun, 29 Jul 2012 21:53:56 +0000 (23:53 +0200)
committerMartin Mares <mj@ucw.cz>
Sun, 29 Jul 2012 21:53:56 +0000 (23:53 +0200)
This is necessary on recent kernels, because the fd is associated
with a mm_struct, which changes upon exec().

box/box.c

index 71ec68c75cd9767d690c429de13379e1a1b8f360..7fe08a7398d652ecde081561d78d82b1de06dddc 100644 (file)
--- a/box/box.c
+++ b/box/box.c
@@ -623,21 +623,30 @@ struct syscall_args {
   struct user user;
 };
 
+static int user_mem_fd;
+
 static int read_user_mem(arg_t addr, char *buf, int len)
 {
-  static int mem_fd;
-
-  if (!mem_fd)
+  if (!user_mem_fd)
     {
       char memname[64];
       sprintf(memname, "/proc/%d/mem", (int) box_pid);
-      mem_fd = open(memname, O_RDONLY);
-      if (mem_fd < 0)
+      user_mem_fd = open(memname, O_RDONLY);
+      if (user_mem_fd < 0)
        die("open(%s): %m", memname);
     }
-  if (lseek64(mem_fd, addr, SEEK_SET) < 0)
+  if (lseek64(user_mem_fd, addr, SEEK_SET) < 0)
     die("lseek64(mem): %m");
-  return read(mem_fd, buf, len);
+  return read(user_mem_fd, buf, len);
+}
+
+static void close_user_mem(void)
+{
+  if (user_mem_fd)
+    {
+      close(user_mem_fd);
+      user_mem_fd = 0;
+    }
 }
 
 #ifdef CONFIG_BOX_KERNEL_AMD64
@@ -1109,7 +1118,10 @@ boxkeeper(void)
                    {
                      msg("[master] ");
                      if (sys == NATIVE_NR_execve)
-                       exec_seen = 1;
+                       {
+                         exec_seen = 1;
+                         close_user_mem();
+                       }
                    }
                  else if ((act = valid_syscall(&a)) >= 0)
                    {