]> Zhao Yanbai Git Server - minix.git/commitdiff
vfs: pm_dumpcore: always clean up process
authorBen Gras <ben@minix3.org>
Wed, 19 Sep 2012 14:57:27 +0000 (16:57 +0200)
committerBen Gras <ben@minix3.org>
Wed, 19 Sep 2012 15:13:17 +0000 (17:13 +0200)
. whenever this function is called, pm will expect
  the process to be cleaned up
. so don't abort the process entirely on error
. fixes a later 'forking on top of in-use child' vfs panic

servers/vfs/misc.c

index eaae794a9ad0484a41c09b6c6259c3925a19f495..04c799f711f7383f3acf7f1f1b739b1518d9cb63 100644 (file)
@@ -695,7 +695,7 @@ int do_svrctl()
  *===========================================================================*/
 int pm_dumpcore(endpoint_t proc_e, int csig, vir_bytes exe_name)
 {
-  int slot, r, core_fd;
+  int slot, r = OK, core_fd;
   struct filp *f;
   char core_path[PATH_MAX];
   char proc_name[PROC_NAME_LEN];
@@ -706,22 +706,23 @@ int pm_dumpcore(endpoint_t proc_e, int csig, vir_bytes exe_name)
   /* open core file */
   snprintf(core_path, PATH_MAX, "%s.%d", CORE_NAME, fp->fp_pid);
   core_fd = common_open(core_path, O_WRONLY | O_CREAT | O_TRUNC, CORE_MODE);
-  if (core_fd < 0) return(core_fd);
+  if (core_fd < 0) { r = core_fd; goto core_exit; }
 
   /* get process' name */
   r = sys_datacopy(PM_PROC_NR, exe_name, VFS_PROC_NR, (vir_bytes) proc_name,
                        PROC_NAME_LEN);
-  if (r != OK) return(r);
+  if (r != OK) goto core_exit;
   proc_name[PROC_NAME_LEN - 1] = '\0';
 
-  if ((f = get_filp(core_fd, VNODE_WRITE)) == NULL) return(EBADF);
+  if ((f = get_filp(core_fd, VNODE_WRITE)) == NULL) { r=EBADF; goto core_exit; }
   write_elf_core_file(f, csig, proc_name);
   unlock_filp(f);
   (void) close_fd(fp, core_fd);        /* ignore failure, we're exiting anyway */
 
+core_exit:
   if(csig)
          free_proc(fp, FP_EXITING);
-  return(OK);
+  return(r);
 }
 
 /*===========================================================================*