]> Zhao Yanbai Git Server - minix.git/commitdiff
Don't panic when out of priv structures.
authorCristiano Giuffrida <cristiano@minix3.org>
Wed, 28 Apr 2010 20:41:23 +0000 (20:41 +0000)
committerCristiano Giuffrida <cristiano@minix3.org>
Wed, 28 Apr 2010 20:41:23 +0000 (20:41 +0000)
servers/rs/manager.c

index e78fb2630a8c97fbfe1b1c013a62a5846f032818..6114e91d9dbd212fb735793b9890c22e255fe4a1 100644 (file)
@@ -453,10 +453,17 @@ struct rproc *rp;
        init_privs(rp, &rp->r_priv);
   }
 
-  /* Set and synch the privilege structure for the new service. */
+  /* Set and synch the privilege structure for the new service.
+   * In case the following fails, we can't kill the process as no signal
+   * manager has been assigned yet. The solution is to directly call
+   * terminate_service() without sending any signal to the process.
+   */
   if ((s = sys_privctl(child_proc_nr_e, SYS_PRIV_SET_SYS, &rp->r_priv)) != OK
        || (s = sys_getpriv(&rp->r_priv, child_proc_nr_e)) != OK) {
-       panic("unable to set privilege structure: %d", s);
+       printf("unable to set privilege structure: %d\n", s);
+       rp->r_flags |= RS_EXITING;
+       terminate_service(rp);
+       return ENOMEM;
   }
 
   /* Copy the executable image into the child process. If this call