--- old/src/os/posix/vm/os_posix.cpp 2014-11-30 00:17:09.454816730 +0900 +++ new/src/os/posix/vm/os_posix.cpp 2014-11-30 00:17:09.301817797 +0900 @@ -51,15 +51,29 @@ struct rlimit rlim; bool success; - n = get_core_path(buffer, bufferSize); + char *core_path = (char *)os::malloc(PATH_MAX, mtInternal); + if (core_path == NULL) { + VMError::report_coredump_status("", false); + return; + } + + n = get_core_path(core_path, PATH_MAX); - if (getrlimit(RLIMIT_CORE, &rlim) != 0) { - jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (may not exist)", current_process_id()); + if (n <= 0) { + jio_snprintf(buffer, bufferSize, "core.%d (may not exist)", current_process_id()); + success = true; +#ifdef LINUX + } else if (core_path[0] == '"') { // redirect to user process + jio_snprintf(buffer, bufferSize, "Core dumps may be processed with %s", core_path); + success = true; +#endif + } else if (getrlimit(RLIMIT_CORE, &rlim) != 0) { + jio_snprintf(buffer, bufferSize, "%s (may not exist)", core_path); success = true; } else { switch(rlim.rlim_cur) { case RLIM_INFINITY: - jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d", current_process_id()); + jio_snprintf(buffer, bufferSize, "%s", core_path); success = true; break; case 0: @@ -67,11 +81,13 @@ success = false; break; default: - jio_snprintf(buffer + n, bufferSize - n, "/core or core.%d (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", current_process_id(), (unsigned long)(rlim.rlim_cur >> 10)); + jio_snprintf(buffer, bufferSize, "%s (max size %lu kB). To ensure a full core dump, try \"ulimit -c unlimited\" before starting Java again", core_path, (unsigned long)(rlim.rlim_cur >> 10)); success = true; break; } } + + os::free(core_path); VMError::report_coredump_status(buffer, success); }