summaryrefslogtreecommitdiff
path: root/user/openjdk8/icedtea-jdk-getmntent-buffer.patch
diff options
context:
space:
mode:
Diffstat (limited to 'user/openjdk8/icedtea-jdk-getmntent-buffer.patch')
-rw-r--r--user/openjdk8/icedtea-jdk-getmntent-buffer.patch88
1 files changed, 88 insertions, 0 deletions
diff --git a/user/openjdk8/icedtea-jdk-getmntent-buffer.patch b/user/openjdk8/icedtea-jdk-getmntent-buffer.patch
new file mode 100644
index 000000000..075a9d423
--- /dev/null
+++ b/user/openjdk8/icedtea-jdk-getmntent-buffer.patch
@@ -0,0 +1,88 @@
+Give a much bigger buffer to getmntent_r.
+
+https://bugs.alpinelinux.org/issues/7093
+
+diff --git a/openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c b/openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c
+index c8500db..d0b85d6 100644
+--- openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c
++++ openjdk/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c
+@@ -33,6 +33,7 @@
+ #include <dlfcn.h>
+ #include <errno.h>
+ #include <mntent.h>
++#include <limits.h>
+
+ #include "sun_nio_fs_LinuxNativeDispatcher.h"
+
+@@ -173,8 +174,8 @@ Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this,
+ jlong value, jobject entry)
+ {
+ struct mntent ent;
+- char buf[1024];
+- int buflen = sizeof(buf);
++ char *buf = NULL;
++ const size_t buflen = PATH_MAX * 4;
+ struct mntent* m;
+ FILE* fp = jlong_to_ptr(value);
+ jsize len;
+@@ -183,10 +184,17 @@ Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this,
+ char* dir;
+ char* fstype;
+ char* options;
++ jint res = -1;
+
+- m = getmntent_r(fp, &ent, (char*)&buf, buflen);
+- if (m == NULL)
++ buf = malloc(buflen);
++ if (buf == NULL) {
++ JNU_ThrowOutOfMemoryError(env, "native heap");
+ return -1;
++ }
++ m = getmntent_r(fp, &ent, buf, buflen);
++ if (m == NULL)
++ goto out;
++
+ name = m->mnt_fsname;
+ dir = m->mnt_dir;
+ fstype = m->mnt_type;
+@@ -195,32 +203,35 @@ Java_sun_nio_fs_LinuxNativeDispatcher_getmntent(JNIEnv* env, jclass this,
+ len = strlen(name);
+ bytes = (*env)->NewByteArray(env, len);
+ if (bytes == NULL)
+- return -1;
++ goto out;
+ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)name);
+ (*env)->SetObjectField(env, entry, entry_name, bytes);
+
+ len = strlen(dir);
+ bytes = (*env)->NewByteArray(env, len);
+ if (bytes == NULL)
+- return -1;
++ goto out;
+ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)dir);
+ (*env)->SetObjectField(env, entry, entry_dir, bytes);
+
+ len = strlen(fstype);
+ bytes = (*env)->NewByteArray(env, len);
+ if (bytes == NULL)
+- return -1;
++ goto out;
+ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)fstype);
+ (*env)->SetObjectField(env, entry, entry_fstype, bytes);
+
+ len = strlen(options);
+ bytes = (*env)->NewByteArray(env, len);
+ if (bytes == NULL)
+- return -1;
++ goto out;
+ (*env)->SetByteArrayRegion(env, bytes, 0, len, (jbyte*)options);
+ (*env)->SetObjectField(env, entry, entry_options, bytes);
+
+- return 0;
++ res = 0;
++out:
++ free(buf);
++ return res;
+ }
+
+ JNIEXPORT void JNICALL