]> Zhao Yanbai Git Server - minix.git/commitdiff
RS: move setuid() hack to where it belongs.. again.
authorDavid van Moolenbroek <david@minix3.org>
Fri, 7 Jan 2011 17:09:30 +0000 (17:09 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Fri, 7 Jan 2011 17:09:30 +0000 (17:09 +0000)
servers/rs/manager.c

index 969969f8dd6649a661daa6b3ff077bdaa2b0dff6..048b7ef3a48aa3f321d85dd1fcdd4df95cc871c9 100644 (file)
@@ -538,18 +538,6 @@ struct rproc *rp;
         free_exec(rp);
   }
 
-  /* The purpose of non-blocking forks is to avoid involving VFS in the forking
-   * process, because VFS may be blocked on a sendrec() to a MFS that is
-   * waiting for a endpoint update for a dead driver. We have just published
-   * that update, but VFS may still be blocked. As a result, VFS may not yet
-   * have received PM's fork message. Hence, if we call mapdriver()
-   * immediately, VFS may not know about the process and thus refuse to add the
-   * driver entry. The following temporary hack works around this by forcing
-   * blocking communication from PM to VFS. Once VFS has been made non-blocking
-   * towards MFS instances, this hack and the big part of srv_fork() can go.
-   */
-  setuid(0);
-
   /* If this is a VM instance, let VM know now. */
   if(rp->r_priv.s_flags & VM_SYS_PROC) {
       if(rs_verbose)
@@ -663,6 +651,19 @@ struct rproc *rp;                          /* pointer to service slot */
 
   /* If the service is a driver, map it. */
   if (rpub->dev_nr > 0) {
+      /* The purpose of non-blocking forks is to avoid involving VFS in the
+       * forking process, because VFS may be blocked on a sendrec() to a MFS
+       * that is waiting for a endpoint update for a dead driver. We have just
+       * published that update, but VFS may still be blocked. As a result, VFS
+       * may not yet have received PM's fork message. Hence, if we call
+       * mapdriver() immediately, VFS may not know about the process and thus
+       * refuse to add the driver entry. The following temporary hack works
+       * around this by forcing blocking communication from PM to VFS. Once VFS
+       * has been made non-blocking towards MFS instances, this hack and the
+       * big part of srv_fork() can go.
+       */
+      setuid(0);
+
       if (mapdriver(rpub->label, rpub->dev_nr, rpub->dev_style,
           rpub->dev_flags) != OK) {
           return kill_service(rp, "couldn't map driver", errno);