]> Zhao Yanbai Git Server - minix.git/commitdiff
- Fixed a bug when running out of priv structures.
authorCristiano Giuffrida <cristiano@minix3.org>
Tue, 11 May 2010 20:49:42 +0000 (20:49 +0000)
committerCristiano Giuffrida <cristiano@minix3.org>
Tue, 11 May 2010 20:49:42 +0000 (20:49 +0000)
- Tell VM about VM calls for every new service instance.

servers/rs/manager.c

index b585b40bf004a96e03f59c7a9332fcc1f7f41791..c20bc3bbc23291de1cdd240b06885fe02af823ef 100644 (file)
@@ -461,8 +461,7 @@ struct rproc *rp;
   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) {
        printf("unable to set privilege structure: %d\n", s);
-       rp->r_flags |= RS_EXITING;
-       terminate_service(rp);
+       cleanup_service(rp);
        return ENOMEM;
   }
 
@@ -478,19 +477,23 @@ struct rproc *rp;
   }
   else {
       if ((s = read_exec(rp)) != OK) {
-       return kill_service(rp, "read_exec failed", s);
+          printf("read_exec failed: %d\n", s);
+          cleanup_service(rp);
+          return s;
       }
   }
   if(rs_verbose)
-      printf("RS: execing child with srv_execve()...\n");
+        printf("RS: execing child with srv_execve()...\n");
   s = srv_execve(child_proc_nr_e, rp->r_exec, rp->r_exec_len, rp->r_argv,
-       environ);
+        environ);
 
   if (s != OK) {
-       return kill_service(rp, "srv_execve failed", s);
+        printf("srv_execve failed: %d\n", s);
+        cleanup_service(rp);
+        return s;
   }
   if(!use_copy) {
-       free_exec(rp);
+        free_exec(rp);
   }
 
   /* The purpose of non-blocking forks is to avoid involving VFS in the forking
@@ -519,6 +522,7 @@ struct rproc *rp;
 {
 /* Clone the given system service instance. */
   struct rproc *replica_rp;
+  struct rprocpub *replica_rpub;
   int r;
 
   if(rs_verbose)
@@ -540,6 +544,16 @@ struct rproc *rp;
       return r;
   }
 
+  /* Tell VM about allowed calls, if any. */
+  replica_rpub = replica_rp->r_pub;
+  if(replica_rpub->vm_call_mask[0]) {
+      r = vm_set_priv(replica_rpub->endpoint, &replica_rpub->vm_call_mask[0]);
+      if (r != OK) {
+          rp->r_next_rp = NULL;
+          return kill_service(replica_rp, "vm_set_priv call failed", r);
+      }
+  }
+
   return OK;
 }
 
@@ -677,10 +691,10 @@ struct rproc *rp;
 
   /* Create and make active. */
   r = create_service(rp);
-  activate_service(rp, NULL);
   if(r != OK) {
       return r;
   }
+  activate_service(rp, NULL);
 
   /* Publish service properties. */
   r = publish_service(rp);