--- a/src/hotspot/share/runtime/os.cpp Fri May 04 15:44:24 2018 +0530
+++ b/src/hotspot/share/runtime/os.cpp Thu May 03 15:17:27 2018 +0200
@@ -1251,6 +1251,33 @@
return formatted_path;
}
+// This function is a proxy to fopen, it tries to add a non standard flag ('e' or 'N')
+// that ensures automatic closing of the file on exec. If it can not find support in
+// the underlying c library, it will make an extra system call (fcntl) to ensure automatic
+// closing of the file on exec.
+FILE* os::fopen(const char* path, const char* mode) {
+ char modified_mode[20];
+ assert(strlen(mode) + 1 < sizeof(modified_mode), "mode chars plus one extra must fit in buffer");
+ sprintf(modified_mode, "%s" LINUX_ONLY("e") BSD_ONLY("e") WINDOWS_ONLY("N"), mode);
+ FILE* file = ::fopen(path, modified_mode);
+
+#if !(defined LINUX || defined BSD || defined _WINDOWS)
+ // assume fcntl FD_CLOEXEC support as a backup solution when 'e' or 'N'
+ // is not supported as mode in fopen
+ if (file != NULL) {
+ int fd = fileno(file);
+ if (fd != -1) {
+ int fd_flags = fcntl(fd, F_GETFD);
+ if (fd_flags != -1) {
+ fcntl(fd, F_SETFD, fd_flags | FD_CLOEXEC);
+ }
+ }
+ }
+#endif
+
+ return file;
+}
+
bool os::set_boot_path(char fileSep, char pathSep) {
const char* home = Arguments::get_java_home();
int home_len = (int)strlen(home);